Python中变量名称与程序效率

7 投票
2 回答
1949 浏览
提问于 2025-04-18 01:57

在编程的时候,我喜欢给我的变量起一些有意义的名字。根据我的理解,在C++和其他编译型语言中,下面这两行代码是完全相同的:

第一行:

bool a = true;

第二行:

bool bob_likes_very_much_to_eat_strawberry_on_friday_evening = true;

原因是:这些代码会被编译,变量名在这个过程中会消失(?)。

另一方面,我想问的是,在Python中,下面这两行代码似乎并不相同:

第一行:

a = True

第二行:

bob_likes_very_much_to_eat_strawberry_on_friday_evening = True

原因是Python是解释型语言,解释器会使用一些字典,把变量名当作键来查询(?)。我不知道这些字典是怎么实现的,但我觉得长变量名的哈希可能会花更多时间(?),在某些情况下可能会有影响。

所以,我是否应该在某些情况下注意保持变量名的长度合理呢?

备注1: 这个讨论和另一个话题很相似: 变量命名是否会影响应用程序的内存使用? 但关于Python的明确答案并没有出现(选中的答案说在解释型语言中有影响,其他答案则说对Python没有影响)。

备注2: 我并不是想提倡那些导致代码难以阅读的微优化。我只是想知道,如果我给变量起了特别长的名字,是否会在执行速度上有所妥协。

2 个回答

1
import timeit

a = timeit.Timer(stmt="a = 0")
a.repeat()

# => [0.025734134655067464, 0.025691468425065977, 0.025745867864316097]

b = timeit.Timer(stmt="bob_likes_very_much_to_eat_strawberry_on_friday_evening = 0")
b.repeat()
# => [0.025780711948755197, 0.025762934357771883, 0.02595848789496813]

... 这个长变量名的速度似乎慢了大约0.2%。

它还会多占用大约30个字节的内存。

3

这个差别应该非常小。不过,我在使用Python 2.7.6和64位Win7时,得到了和第一个答案不一样的结果。

>>> import timeit
>>> timeit.timeit(stmt="a = True", number=1000000000)
33.17448742396358
>>> timeit.timeit(stmt="bob_likes_very_much_to_eat_strawberry_on_friday_evening = True", number=1000000000)
32.47728300208675
>>> timeit.timeit(stmt="bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening_bob_likes_very_much_to_eat_strawberry_on_friday_evening = True", number=1000000000)
33.11944278143642

所以,这个结果应该是和实现方式以及平台有关的。

从内存使用的角度来看,考虑到页面对齐,变量名越长,所占用的空间应该是一样的或者更多。

另外,即使长变量名会多花一点时间和空间,我还是会选择使用它,因为它更有意义且更容易理解。这比效率更重要。

撰写回答