【发布时间】:2018-03-30 05:06:51
【问题描述】:
我试图说服自己,计数排序比 Python 中的排序方法执行得更快。然而,即使对于像 1000 万个元素这样的大输入,调用 sorted 内置函数似乎也更快。我可以做些什么来加快计数排序?
我生成一个小写字母列表以将示例简化为 26 个唯一值:
letters = [random.choice(string.ascii_lowercase) for i in range(10000000)]
然后我对计数排序进行以下变体:
def sorted_count(letters):
counts = [0] * 26
for letter in letters:
counts[ord(letter) - 97] += 1
out = [None] * len(letters)
j = 0
for i in range(len(counts)):
while counts[i] > 0:
out[j] = chr(i + 97)
counts[i] -= 1
j += 1
return out
即使在 10,000,000 个元素上,对 sorted(letters) 的调用也快了约 4 倍。
如何提高排序的速度?
【问题讨论】:
-
你有完整的timeit脚本吗?
-
另外,您将纯 Python 代码与优化的 C 代码进行比较。慢 4 倍确实不错,可能被认为是“更快”。
-
您是在询问(理论上的)算法改进吗?实际上,在纯 Python 中衡量算法的性能几乎没有意义。正如@EricDuminil 提到的,与built-in sort(这是用C 编写的比较排序)的比较是无效的。对于现实世界的用例,使用本地语言(可能是 python 的 C++ 扩展)、并行化、尝试 GPU、在输入数据中查找结构以实现更快的边缘情况处理等。
-
没有考虑优化的 C 代码。我认为这是一个很好的观点。我的问题是关于 Python 的细节而不是理论上的改进。
标签: python python-3.x performance sorting big-o