提高函数内python struct pack的速度

2 投票
1 回答
819 浏览
提问于 2025-04-18 02:49

我正在测试Python中struct的打包和解包性能,发现如果把它放在一个函数里,速度会更快:

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

代码是一样的,但放在函数里的速度更快。

这是为什么呢?

1 个回答

2

在一个函数里面的循环比在全局范围内的同样循环要快:

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中全局命名空间和局部命名空间访问速度的差异来解释。

撰写回答