Python - 运行程序越来越快

3

I have this simple python code:

import numpy as np

a = np.array([1,2,3,4,5,6])

print a

如果我在sublime text上一遍又一遍地运行它,使用(cmd+B),每次它的输出结果[1 2 3 4 5 6]都会更快地打印出来,时间如下(秒):

 1st run: [Finished in 7.7s]
 2nd run: [Finished in 1.6s]
 3rd run: [Finished in 0.5s]

然后它稳定在0.5秒,对于这样一个简单的程序来说,速度相当慢。

因此,我尝试计时,并得到以下结果:

[1 2 3 4 5 6]
0.00280284881592
[Finished in 7.4s]

[1 2 3 4 5 6]
0.00325489044189
[Finished in 2.0s]

[1 2 3 4 5 6]
0.000813961029053
[Finished in 0.1s]

进一步测试,我计时了绕过包导入的代码:

a = [1,2,3,4,5,6]; 
print(a)

并获得了:

[1, 2, 3, 4, 5, 6]
0.000219106674194
[Finished in 1.4s]

最后,使用numpy

import numpy as np
a = np.array([1,2,3,4,5,6])
a=1

I got:

1.2614569664
[Finished in 2.5s]

计算机内存出现了什么问题,导致程序表现出这样的行为?

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - littleO
1
如果您只是从命令行运行此程序,而不使用Sublime Text,并使用timeit或其他工具计时,那么您会得到合理的运行时间吗? - littleO
@littleO 不错的主意。请查看编辑。 - 8-Bit Borges
1
任何包括import和/或I/O操作(如print)的时间都应该小心处理,因为你不知道Python是否需要为包创建字节码,或者是否有任何东西拦截/暂时阻止了print的输出。特别是如果你使用像sublime text这样的编辑器,实际的编辑器可能会引入一些额外的偏移量(例如启动Python内核)。有趣的是将时间与a = [1,2,3,4,5,6]; print(a)import numpy; a = np.array([1,2,3,4,5,6])以及简单的a = 1进行比较,以获取时间的各个组成部分。 - MSeifert
我明白了。现在检查一下。在进行导入之前,我等了大约一分钟。 - 8-Bit Borges
显示剩余5条评论
1个回答

2
我认为你的帖子中有三个主要问题:
  1. 为什么每次运行速度都更快?
  2. 为什么它稳定在0.5秒?对于这样一个简单的程序来说,这很慢。
  3. 连续重复操作10分钟后,为什么会再次出现这种情况?

为什么每次运行速度都更快?

原因是操作系统会将经常使用的文件从磁盘缓存到内存中。而内存访问比磁盘访问要快得多。这被称为磁盘缓存或页面缓存。多次运行Python后,内存会变得“温暖”,操作系统可以从快速的内存中加载相关文件。更准确地说,并不是每次都会持续变快。相反,在两三次之后,它会达到最快速度。

为什么它稳定在0.5秒?

Sublime Text给出的“Finished in”后面的时间包括两部分:一部分是启动python本身所用的时间,另一部分是运行脚本所用的时间。

在您的情况下,大部分时间都是用来启动 python 和导入 numpy 包的时间。在我的机器上有一些情况,所有时间都是“稳定”的时间。
案例1:
import numpy as np
print(0)

案例2:
[用时0.7秒]
print(0)

第三种情况:
import datetime
print(0)

如上所示,启动Python花费了0.2秒,导入numpy花费了0.5秒。我认为numpy非常庞大,因此导入速度较慢。
在10分钟后连续重复操作三次后,这种情况再次发生。为什么?
因为磁盘缓存会根据最新访问动态调整。10分钟后,你的计算机中的其他程序占用了内存。内存变得“冷却”了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接