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

2024-05-11 00:17:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我一般是这样问的,因为我不能发布实际的代码,因为各种原因。以下是在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几个月了,并且对理解正在发生的事情很感兴趣,这样我可以更恰当地编写代码。你知道吗


Tags: 文件对象selfnumpyforobjectdeffilename
1条回答
网友
1楼 · 发布于 2024-05-11 00:17:29

[由问题转换而来的答案]


解决方案

  • 没有实际问题(!)。。。只是我的观察很糟糕。你知道吗

正如m.wasowski和JohnZwinck在评论中指出的那样,%timeit运行了多次。正如他们所说,由于缓存,后续运行人为地减少了时间。你知道吗

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

import time
tin = time.time()
q = MyClassName('testfile.dat')
print time.time() - tin

我第一次实例化'测试文件.dat,需要整整3.3-3.5秒。 如果我再运行那块碎片,它会以0.9秒的速度进入 所以,正如评论者所说,它是在多轮竞选中取其精华

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

感谢大家的快速回复。你知道吗

相关问题 更多 >