【发布时间】:2021-02-19 23:33:11
【问题描述】:
我不久前写了这个函数:
def faster_print(*args, sep=" ", end="\n", file=stdout):
file.write(sep.join(map(str, args))+end)
我测试了它:
from sys import stdout
from time import perf_counter
def faster_print(*args, sep=" ", end="\n", file=stdout):
file.write(sep.join(map(str, args))+end)
def time(function, *args, **kwargs):
start = perf_counter()
function(*args, **kwargs)
return perf_counter()-start
def using_normal_print(number):
for i in range(number):
print("Hello world.", 5, 5.0, ..., str)
def using_faster_print(number):
for i in range(number):
faster_print("Hello world.", 5, 5.0, ..., str)
normal_time = time(using_normal_print, number=100)
faster_time = time(using_faster_print, number=100)
print("Normal print:", normal_time)
print("My print function", faster_time)
事实证明,它只是在 IDLE 中更快,而不是在 cmd 中。我知道 IDLE 会为 sys.stdout、sys.stdin 和 sys.stderr 创建自己的对象,但我不明白为什么它只会减慢 python 内置的 print 函数。 This 回答说内置的 print 函数是用 c 编写的。由于我的函数需要从 python 字节码编译成机器码,这不应该让它更快吗?
我正在使用 Python 3.7.9 和 IDLE 版本 3.7.9
【问题讨论】:
-
datetime.now()对于此目的不一定准确;您应该使用time.perf_counter作为这个“具有最高可用分辨率的时钟来测量短持续时间”,或者您可以使用timeit模块而不是滚动您自己的计时代码。 -
不要使用
datetime.now()进行基准测试。你应该改用time.process_time。 -
好的,我会尝试更新问题
-
使用 timeit 进行 1k 次迭代时它们大致相同
-
@TeejayBruno 你在使用 IDLE 吗?什么版本?
标签: python python-3.x printing python-idle