1

我刚刚偶然发现了一些对我来说毫无意义的东西。在我工作的地方,我们有许多 Python CGI 网页(只是一个简单的 Apache 服务器设置,不运行 Django / Turbogears 等),我对脚本运行需要多长时间感到有点沮丧。我放弃了很多 time.time() 调用,并认为我已将瓶颈确定为 sqlalchemy 的导入(尽管我现在认为它可能是“任何大模块”,因此 sqlalchemy 标记可能放错了位置)。

所以,在尝试了各种不同的事情之后,我最终得到了这个例子,(假设文件名为'test.py')

#!/usr/bin/python

import time
t1 = time.time()
import sqlalchemy
print time.time() - t1

如果我在命令提示符下运行 test.py(通过将其设置为可执行),它通常会显示该导入语句的大约 0.7 秒(+/- 0.1 秒)。

但是,如果我打电话

python -c "execfile('test.py')"

我的速度提高了大约 10 倍

所以我想我会用一个调用的小 tcsh 脚本来包装我的一些 python CGI 脚本

python -c "execfile('mypythoncgiscript.py')"

我通常会获得大约 2-3 倍的加速,而且,重要的是,返回的数据仍然是正确的。

使用 cpu-heavy 而不是 import-heavy 脚本,例如:

t1 = time().time()
a = 0
for i in xrange(10000000):
    a += 1
print time.time() - t1

使用 execfile 时,我得到了一个非常轻微的减速,这是我从轻微的 execfile 开销中所期望的。

有谁知道这里发生了什么?谁能重现类似的速度差异,或者我的设置是否以某种方式被 execfile 修复?我认为导入在 execfile 中的行为略有不同(或者至少,一旦你离开 execfile 语句就不一定可见),但我对速度的如此大差异感到惊讶。

我在 Oracle 提供的“Enterprise Linux Server release 5 (Carthage)”上运行 python 2.4 64bit。

4

1 回答 1

0

我的猜测是没有真正的区别。它只是看起来有很大的不同。尝试像这样测试它以确保:

# time python test.py
0.0514879226685
python test.py  0.06s user 0.01s system 95% cpu 0.071 total

# time python -c 'execfile
0.0515019893646
python -c 'execfile("test.py")'  0.06s user 0.01s system 95% cpu 0.071 total
于 2010-12-23T10:36:57.073 回答