我只是泛泛地问这个问题,因为由于各种原因我不能发布实际的代码。以下是在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二进制文件读取需要2.5秒的3.5秒来创建一个对象。但是,当我在循环或cprofile之外创建单个对象时,会调用相同的例程。
它只不过是一个对象的创建过程。
我在Windows7机器上运行并监视任务管理器。有一次,它看起来像是我耗尽了物理内存,正在进行页面交换,所以我重新启动了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秒的时候出现
所以,时间就像评论者所说的,它是多跑中最好的一次
我应该更清楚,而不是相信我对手动实例化对象所花时间的经验观察。单个对象的实例化速度从未超过循环。
感谢大家的快速回复。

08-28 02:25