python3:时差:int的列表理解VS in的列表理解

2024-05-18 10:53:18 发布

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

我对列表理解的计算时间有问题。在解决这个问题时,我发现:

In [209]: now = datetime.datetime.now()
     ...: for i in range(15):
     ...:     k = [0 for j in range(100000)]
     ...:     print(datetime.datetime.now() - now)
     ...:     
     0:00:00.004146
     0:00:00.007886
     0:00:00.011533
     0:00:00.015274
     0:00:00.019104
     0:00:00.022788
     0:00:00.026528
     0:00:00.030252
     0:00:00.033969
     0:00:00.037713
     0:00:00.041409
     0:00:00.045144
     0:00:00.048842
     0:00:00.052526
     0:00:00.056224

没问题:列表理解很快。现在不创建int,如果我们创建int的列表。。。你知道吗

In [211]: now = datetime.datetime.now()
     ...: for i in range(15):
     ...:     k = [[0] for j in range(100000)]
     ...:     print(datetime.datetime.now() - now)
     ...:     
     0:00:00.047167
     0:00:00.107979
     0:00:00.170456
     0:00:00.231888
     0:00:00.293667
     0:00:00.354984
     0:00:06.686698    <=== Taking much more time
     0:00:06.747476
     0:00:06.811326
     0:00:06.874809
     0:00:06.937590
     0:00:06.998185
     0:00:07.068399
     0:00:13.449616    <=== Taking much more time
     0:00:13.511518

看起来python需要每X次迭代执行一次操作。这个手术在这里要花很多时间。你知道吗

我想这与内存分配等有关,但是如果有人知道为什么要解释它,我会非常感兴趣的!你知道吗

谢谢你。你知道吗

编辑:更多信息:我在ipython的tmux会话中遇到了问题。如果我打开一个新的tmux窗口,在ipython上问题就不存在了。。。 所以问题似乎与一个特定的打开的tmux窗口有关?我还有一个开放的会议,如果你们想尝试一些东西。。。你知道吗

所以我们说它只是呕吐了还是有什么问题?你知道吗


Tags: in列表fordatetimetimemore时间range
1条回答
网友
1楼 · 发布于 2024-05-18 10:53:18

您的度量方法不精确—您在函数调用中有大量开销,print执行时间将随着您执行系统调用而变化。要获得更好的结果,请尝试以下操作:

import timeit
int_res = [timeit.timeit('[0 for i in x]', setup="x = range(100000)", number=1) for i in range(1000)]
list_res = [timeit.timeit('[[0] for i in x]', setup="x = range(100000)", number=1) for i in range(1000)]
print("Ints:", min(int_res), max(int_res))
print("Lists:", min(list_res), max(list_res))

输出:

Ints: 0.004607329028658569 0.04245903599075973
Lists: 0.015519230044446886 0.1320938270073384

如您所见,这两种方法显示完全相同的行为。你知道吗

然后,我试图检验关于垃圾收集器的假设。我做了以下工作:

import timeit
import gc
int_res = [timeit.timeit('[0 for i in x]', setup="x = range(100000); gc.collect()", number=1) for i in range(1000)]
list_res = [timeit.timeit('[[0] for i in x]', setup="x = range(100000); gc.collect()", number=1) for i in range(1000)]
print("Ints:", min(int_res), max(int_res))
print("Lists:", min(list_res), max(list_res))

输出:

Ints: 0.004779412993229926 0.02010424993932247
Lists: 0.015465378062799573 0.03042234410531819

这里,不测量setup=部分并且不产生任何影响。每次测量都使用timeit函数执行,然后记忆。你知道吗

相关问题 更多 >