Python脚本中使用print语句的性能影响

52

我有一个Python脚本,处理一个包含约400万行的巨大文本文件,并将数据写入两个单独的文件。

我添加了一个打印语句,为调试输出每一行的字符串。我想知道从性能角度来看会有多糟糕?

如果它性能非常糟糕,我可以删除调试语句。

编辑

事实证明,在一个有400万行的文件中为每一行添加打印语句会严重影响时间。


4
timeit 模块可以用来测量代码执行时间,它可以在不同的实现中比较代码速度。该模块提供了一个简单的接口来测试小块 Python 代码的执行时间。默认情况下,它执行测试的次数为一百万次,并返回最佳执行时间。你可以通过调整参数来定制测试行为。 - wim
由于您需要执行大量的打印操作,因此速度会变慢,任何额外的处理都会带来一些性能损失。 - Matt Seymour
1
item 发送到套接字队列:程序将首先完成写入,然后套接字的控制台将延迟打印输出。 - ajsp
2个回答

66

只是为了好玩尝试用一个非常简单的脚本来做,结果差别很大:

在large.py中:

target =  open('target.txt', 'w')

for item in xrange(4000000):
    target.write(str(item)+'\n')
    print item

计时:

[gp@imdev1 /tmp]$ time python large.py
real    1m51.690s
user    0m10.531s
sys     0m6.129s

gp@imdev1 /tmp]$ ls -lah target.txt 
-rw-rw-r--. 1 gp gp 30M Nov  8 16:06 target.txt

现在注释掉“print”并再次运行:

gp@imdev1 /tmp]$ time python large.py 
real    0m2.584s
user    0m2.536s
sys     0m0.040s

6
当你注释掉写入操作,保留打印操作,并使用 > target.txt 运行时,会发生什么? - Tim
1
@Tim:奇怪的是它运行得更快了,但可能是因为我的机器比之前更空闲,现在没有时间多次运行以使用更可靠的统计方法。[gp@imdev1 /tmp]$ time python large.py > target.txt 真实时间 0m1.954秒 用户时间 0m1.897秒 系统时间 0m0.049秒 - GSP
10
将标准输出重定向到文件会更快,事实上,您可以将其直接写入文件,然后在编辑器中打开该文件,所需时间比将大量的 I/O 输出到屏幕上要少。 - agentp
1
@GSP 谢谢。看起来我应该移除这些打印语句。 - Sudar
1
我也在想,是否有一个冗长选项来检查布尔值以确定是否打印输出会影响时间。使用 if False: print item 时,运行时间为 1.417秒,而没有任何打印输出则运行时间为 1.357秒 - akozi
1
你也可以使用模运算打印每1000个项目,以显示进度:for i,item in enumerate(range(4_000_000)): if i%1_000==0: print(i, item) - ATH

6

是的,它会影响性能。 我编写了一个小程序来演示-

import time
start_time=time.time()
for i in range(100):
    for j in range(100):
        for k in range(100):
            print(i,j,k)
print(time.time()-start_time)
input()

测量的时间为-160.2812204496765,然后我将print语句替换为pass。结果令人震惊。没有print的测量时间为-0.26517701148986816。

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