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

Sco*_*ell 0 python algorithm list set

如果每个集合的长度完全相同并且每个集合中的每个项目长度相同,那么循环set数字Python 或set字母Python会更快吗?为什么?

我认为会有差异,因为字母有更多可能的字符[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()
Run Code Online (Sandbox Code Playgroud)

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

更新:我对Python的特定散列算法感兴趣,以及使用此实现在幕后发生的事情.

Ste*_*sop 6

可能有一些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
Run Code Online (Sandbox Code Playgroud)

因此,在我的Python副本中,这些哈希结果与这些报告的Python哈希算法相匹配.与CPython一样,您可以查看源代码以确认算法.