python结构包加速内部函数

python结构包加速内部函数,python,serialization,Python,Serialization,我正在测试python的struct pack/unpack性能,并注意到如果将其放入函数中,它将加快速度: import time import struct from io import BytesIO def pack(b): for i in range(10000000): b.write(struct.pack('!i', i)) b = BytesIO() start = time.time() pack(b) end = time.time() pri

我正在测试python的struct pack/unpack性能,并注意到如果将其放入函数中,它将加快速度:

import time
import struct
from io import BytesIO

def pack(b):
    for i in range(10000000):
        b.write(struct.pack('!i', i))

b = BytesIO()
start = time.time()
pack(b)
end = time.time()
print(end - start)

b2 = BytesIO()
start = time.time()
for i in range(10000000):
    b2.write(struct.pack('!i', i))
end = time.time()
print(end - start)
运行此命令会使

2.639040946960449
3.0683419704437256
代码相同,但功能更快


这是为什么?

函数内部的循环比全局级别的相同循环快:

from timeit import default_timer as timer

N = 10000000

def f():
    for i in range(N):
        pass

start = timer()
for i in range(N):
    pass
print("global %.2f" % (timer() - start,))

start = timer()
f()
print("function %.2f" % (timer() - start,))
输出:

global 0.71
function 0.40

这可能是因为CPython中全局命名空间访问与本地命名空间访问的速度不同。

这可能是因为查找b。在函数内部,b是一个参数,它的变量查找速度更快,因为运行时只需查看本地对象。另一方面,在函数的外部版本中,b2是一个全局变量,因此变量名查找必须经过更多步骤,最终需要更长的时间。您可以通过将b设置为全局参数而不是函数参数来检查它。如果您这样做,性能应该会更接近。@我刚刚尝试过,删除'b'参数并在函数define下添加'global b',它只会减慢一点,在我的机器中变为~2.70,但仍然比直接运行快。有趣的是,我想您也需要将“I”变为全局。