gpt4 book ai didi

python - 循环遍历一组 Python 数字或一组字母是否更快?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:30:04 24 4
gpt4 key购买 nike

循环遍历 Python set 数字或 Python set 字母是否更快,因为每个集合的长度完全相同并且每个集合中的每个项目都是一样长?为什么?

我认为会有差异,因为字母 [a-zA-Z] 比数字 [0-9] 具有更多可能的字符,因此会更“随机”并可能在某种程度上影响散列。

numbers = set([00000,00001,00002,00003,00004,00005, ... 99999])

letters = set(['aaaaa','aaaab','aaaac','aaaad', ... 'aaabZZ']) # this is just an example, it does not actually end here

for item in numbers:
do_something()

for item in letters:
do_something()

其中 len(数字) == len(字母)

更新:我对 Python 的特定哈希算法以及此实现的幕后发生的事情很感兴趣。

最佳答案

可能有一些我不知道的 Python 特定实现细节与我在这里的一般论点困惑不堪,但是:

  • 创建字符串集可能会比创建整数集慢一点(所有其他条件都相同),因为对字符串的哈希操作需要一些(小)时间来运行,而整数的散列运算很简单。
  • 迭代一个集合不执行任何散列操作,因此散列时间在这里无关紧要。
  • 集合的迭代取决于集合中元素的数量和支持该集合的哈希表中的桶数。因此,哈希函数的分布仅在它导致哈希表增加桶计数时才重要。对于某些哈希表实现,这是不可能的(因为桶计数仅在负载因子超过阈值时增加,而不仅仅是因为冲突)。其他哈希表实现会在发生大量冲突时调整大小。我不知道 CPython 是哪个。
  • 无论如何,您给出的一组整数的特定示例将生成分布均匀的哈希值。
  • 有一种方法可以找出 Python 中哪个更快,即 timeit,并提供您关心的数据的真实示例。投机通常是浪费时间。

你可以看到 Python 的哈希算法的结果是这样的:

>>> foo = 3
>>> foo.__hash__()
3
>>> foo = 1856348
>>> foo.__hash__()
1856348
>>> foo = "\x00"
>>> foo.__hash__()
1
>>> foo = "\x01"
>>> foo.__hash__()
128000384
>>> foo = "\x02"
>>> foo.__hash__()
256000771

所以在我的 Python 副本上,那些哈希结果与这些 reported Python hash algorithms 匹配.与 CPython 一样,您可以查看源代码以确认算法。

关于python - 循环遍历一组 Python 数字或一组字母是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12347551/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com