getattr() 比 Python 3.13.1 中的点运算符更快吗?

问题描述 投票:0回答:1

我正在运行这个Python脚本:

height_map: list[list[Point]] = [[Point(x, y) for x in range(MAP_SIZE)] for y in range(MAP_SIZE)]
start = time_ns()
for i in range(MAP_SIZE):
    for o in range(MAP_SIZE):
        print(str(height_map[i][o].height) + ', ', end='')
    print()
print(time_ns() - start)
time1 = time_ns() - start
start = time_ns()
for i in range(MAP_SIZE):
    for o in range(MAP_SIZE):
        print(str(getattr(height_map[i][o], "height")) + ', ', end='')
    print()
print(time_ns() - start)
time2 = time_ns() - start
print(f'accesser operator: {time1 * 10 ** -9}\ngetattr function: {time2 * 10 ** -9}')

这样我就可以测试两者之间的性能差异(我有一些功能需要使用

getattr()
)。

奇怪的是,我从 `getattr() 获得的时间比点运算符更快:

accesser operator: 0.14477610000000002
getattr function: 0.0963573

Point
类是一个准系统类,使用
__slots__
而不使用
__dict__

为什么我会从

getattr()
获得更好的表现?

python performance
1个回答
0
投票

我完全忘记了Python的内存管理系统是如何工作的,我习惯了JIT编译。真正的原因是Python已经加载了所有数据。感谢@Barmar。

© www.soinside.com 2019 - 2024. All rights reserved.