Python:循环/理解/映射中对象创建的时间与一次性

Python:循环/理解/映射中对象创建的时间与一次性,python,loops,object,timing,Python,Loops,Object,Timing,由于各种原因,我无法发布实际代码,所以我一般都会这样问。以下是在iPython笔记本中完成的 我创建了一个这样结构的类(它需要numpy) 等等 代码是可靠的。我可以做到以下几点 q = MyClassName('testfile.dat') # Instantiate an object q.other_function1() # Invoke methods 等等 此创建的时间大约为0.9秒 但是,如果我有文件列表 文件名=['f1.dat'、'f2.dat'、…、

由于各种原因,我无法发布实际代码,所以我一般都会这样问。以下是在iPython笔记本中完成的

我创建了一个这样结构的类(它需要numpy)

等等

代码是可靠的。我可以做到以下几点

q = MyClassName('testfile.dat') # Instantiate an object
q.other_function1()             # Invoke methods
等等

此创建的时间大约为0.9秒

但是,如果我有文件列表
文件名=['f1.dat'、'f2.dat'、…、'f10.dat']
并在循环、理解或映射中创建对象

Chomp = map( MyClassName, filenames )

Chomp = [ MyClassName(j) for j in filenames ]

Chomp = []
for j in filenames:
    Chomp.append( MyClassName(j) )
创建每个对象需要3.5秒以上。循环需要3.5秒/文件x文件数才能完成

我尝试过的事情: 我查阅了有关列表创建、列表附加计时、内存管理/假设、在每个对象创建后禁用/重新启用垃圾收集等信息

我还导入了在单个对象创建上运行cprofile

所有这些报告大约3.5秒。cprofile说,一次numpy二进制读取需要3.5秒中的2.5秒来创建一个对象。但是,当我在循环或cprofile之外创建单个对象时,会调用相同的例程

只有创建一个对象才能快速进行

我在Windows 7计算机上运行并监视任务管理器。在某一点上,它看起来像是我已经耗尽了物理内存,正在进行页面交换,所以我重新启动了iPython/Notebook,只启用了一个内核,并且几乎没有其他程序在运行。内存负载下降了,但循环性能没有得到任何改善


一般来说,我是OOP新手,在Python上工作了几个月,对了解发生了什么很感兴趣,这样我就可以更恰当地编写代码了。

[答案由问题转换而来]


解决方案

  • 没有实际问题(!)。。。只是我的观察非常糟糕
正如m.wasowski和JohnZwinck在评论中指出的那样,
%timeit
运行多次。正如他们所说的,后续的运行由于缓存而人为地减少了时间

在我尝试过的所有事情中,我没有尝试以下内容:

import time
tin = time.time()
q = MyClassName('testfile.dat')
print time.time() - tin
我第一次实例化'testfile.dat',需要整整3.3-3.5秒。 如果我再次运行该片段,它将以约0.9秒的速度进入 因此,正如评论员所说,timeit是在多次运行中取其精华

我不应该相信我的经验观察,手动实例化一个对象需要多长时间。单个对象的实例化速度从未超过循环


感谢大家的快速回复。

I有没有可能,当您计时
%timeit q=MyClassName('testfile.dat')
时,该文件已经缓存在内存中,因为您以前访问过它?这可能会得到更低的分数。我尝试一次创建一组文件,每个文件都在@oldGuyintClub:%time超时。它可能会多次运行该函数,这可能会在后续运行时以完全相同的输入加速。与循环相反,循环每次都有不同的输入,因此没有缓存命中。@在开发过程中,您可能希望对其进行分析,而不是移动到GUI包装的python之外,以便更快地执行代码。如果没有在类内实现
[usec]
-评测报告,那么旧式的
-for
-循环也允许进行更精确的计时(基于1-3秒,在类方法内花费几纳秒的开销有很大的空间来给出详细的代码执行时间)@John Zwinck:Ok,我一定会在早上回去工作的时候调查这件事。但是,IIRC,在没有1秒时间的情况下运行对象创建。当我开始运行循环时,我开始计时,而且计时感觉很奇怪
Chomp = map( MyClassName, filenames )

Chomp = [ MyClassName(j) for j in filenames ]

Chomp = []
for j in filenames:
    Chomp.append( MyClassName(j) )
import time
tin = time.time()
q = MyClassName('testfile.dat')
print time.time() - tin