在Python中循环一组数字或一组字母会更快吗?

2024-05-16 09:40:19 发布

您现在位置:Python中文网/ 问答频道 /正文

如果每个集合的长度完全相同,并且集合中的每个项目的长度都相同,那么遍历一个由数字组成的Python set或字母组成的Pythonset会更快吗?为什么?在

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

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(字母)

Update:我对Python的特定哈希算法以及这个实现的幕后操作感兴趣。在


Tags: 项目inforlen字母数字item字符
2条回答

Python可能有一些特定的实现细节,我不知道这些细节与我的一般论点有什么关系,但是:

  • 创建字符串集可能比创建整数集慢一些(其他条件都相同),因为字符串上的哈希操作需要一些(小)时间来运行,而对整数的哈希操作则很简单。在
  • 迭代一个集合不执行任何散列操作,因此散列的时间与此无关。在
  • 迭代一个集合取决于集合中元素的数量以及支持该集合的哈希表中的桶数。因此,散列函数的分布只在它导致哈希表增加bucket计数的情况下才重要。对于一些不可能实现的哈希表(因为bucket count只会在负载因子超过阈值时增加,而不仅仅是因为冲突)。其他哈希表实现在发生大量冲突时调整大小。我不知道哪个是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 -mtimeit -s 'import string;import random;s=set("".join(random.sample(string.printable, 5))for _ in range(10000))' 'for foo in s: bar=foo'
1000 loops, best of 3: 376 usec per loop

% python -mtimeit -s 'import random;s=set(int("".join(map(str,random.sample(range(10),5))))for _ in range(10000))' 'for foo in s: bar=foo'                     
1000 loops, best of 3: 322 usec per loop

看起来你是对的,有一点差别,但你需要做更多的测试来自信地说很多。在

相关问题 更多 >