python - 尝试为更大的文件优化快速排序
问题描述
有谁知道我可以如何更好地优化此代码以运行更大的文件。它适用于较小的输入,但我需要它来运行超过 200,000 个单词的文件。有什么建议么?
谢谢你。
import random
import re
def quick_sort(a,i,n):
if n <= 1:
return
mid = (len(a)) // 2
x = a[random.randint(0,len(a)-1)]
p = i - 1
j = i
q = i + n
while j < q:
if a[j] < x:
p = p + 1
a[j],a[p] = a[p],a[j]
j = j + 1
elif a[j] > x:
q = q - 1
a[j],a[q] = a[q],a[j]
else:
j = j + 1
quick_sort(a,i,p-i+1)
quick_sort(a,q,n-(q-i))
file_name = input("Enter file name: ")
my_list = []
with open(file_name,'r') as f:
for line in f:
line = re.sub('[!#?,.:";\']', '', line).lower()
token = line.split()
for t in token:
my_list.append(t)
a = my_list
quick_sort(a,0,len(my_list))
print("List After Calling Quick Sort: ",a)
解决方案
您随机选择用于枢轴的索引x
是使用输入列表的整个大小a
,而不仅仅是您应该在当前调用中排序的部分。这意味着您的轴通常根本不在当前部分,因此您将无法有效地减少您的问题(因为所有值都将位于轴的同一侧)。这会导致大量的递归,并且对于更大的输入,您几乎总是会达到递归上限。
修复很简单,只需更改获取方式x
:
x = a[random.randrange(i, i+n)]
我喜欢randrange
比 好得多randint
,但randint(i, i+n-1)
如果你有其他感觉,你可以使用。
推荐阅读
- gitlab-api - 以“机器人”用户的身份在 Gitlab API 上发布注释
- netlogo - 我可以根据比较变量值的结果将乌龟指向特定的补丁吗?
- regex - 实现正则表达式代码而不添加对 RegEx 库的引用
- javascript - 对 ul li 中的所有元素执行相同的操作
- javascript - Javascript 和 css 文件在来自 tomcat 服务器的浏览器响应中截断
- python - cffi embedding_init_code 导入自定义py文件
- database-design - 带有 Kimball 的星型模式和数据集市的数据湖
- python-3.x - 执行包含完整路径的python可执行文件和脚本
- r - 抑制 R 中的 rgdal 警告
- java - 通过 XML 配置 Spring Ehcache 3.x