我一般是这样问的,因为我不能发布实际的代码,因为各种原因。以下是在iPython笔记本中完成的
我创建了一个这样结构的类(它需要numpy)
class MyClassName(object):
def __init__(self, filename):
self.filename = filename
self.read_binary_file() # Run these on object creation
self.calculate_parameters()
self.check_for_errors()
...
def read_binary_file( self ): # This requires numpy.
# # The file is 250MB binary and
# # ultimately yields a numpy array
# # 32 x 32 x 100000 element
...
def calculate_parameters( self ):
...
def check_for_errors( self ):
...
def other_function1( self ):
...
def other_function2( self ):
等等
密码是正确的。我可以做到以下几点
q = MyClassName('testfile.dat') # Instantiate an object
q.other_function1() # Invoke methods
等等
%timeit q = MyClassName('testfile.dat')
为这个创建提供大约0.9秒
但是如果我有一个文件列表
filenames = ['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文件数才能完成
我尝试过的事情: 我查阅了有关列表创建、列表附加计时、内存管理/假设、在每个对象创建之后禁用/重新启用垃圾收集等信息
我还导入了单个对象创建的run cprofile。你知道吗
所有这些报告大约3.5秒。cprofile说numpy二进制读取需要3.5秒中的2.5秒来创建单个对象。但是,当我在循环或cprofile之外创建单个对象时,会调用相同的例程。你知道吗
只有创建一个对象才能快速进行。你知道吗
我在Windows7机器上运行并监视任务管理器。有一次,我的物理内存被耗尽,正在进行页交换,所以我重新启动了iPython/Notebook,只启用了一个内核,其他程序也很少运行。内存负载下降了,但循环性能没有得到任何改善。你知道吗
一般来说,我对OOP是新手,已经使用Python几个月了,并且对理解正在发生的事情很感兴趣,这样我可以更恰当地编写代码。你知道吗
[由问题转换而来的答案]
解决方案
正如m.wasowski和JohnZwinck在评论中指出的那样,
%timeit
运行了多次。正如他们所说,由于缓存,后续运行人为地减少了时间。你知道吗在我尝试过的所有事情中,我没有尝试过以下几点:
我第一次实例化'测试文件.dat,需要整整3.3-3.5秒。 如果我再运行那块碎片,它会以0.9秒的速度进入 所以,正如评论者所说,它是在多轮竞选中取其精华
我应该更清楚,不要相信我的经验观察,手动实例化一个对象需要多长时间。单个对象的实例化速度从未超过循环。你知道吗
感谢大家的快速回复。你知道吗
相关问题 更多 >
编程相关推荐