【发布时间】:2010-12-16 01:35:23
【问题描述】:
这与here 几乎是同一个问题,只是我问的是排序结果的最有效解决方案。
我有一个列表(0到12之间随机大约10个整数),例如:
the_list = [5, 7, 6, 5, 5, 4, 4, 7, 5, 4]
我想创建一个函数,它返回按第一个元素排序的元组(项目、计数)列表,例如
output = [(4, 3), (5, 4), (6, 1), (7, 2)]
到目前为止我用过:
def dupli(the_list):
return [(item, the_list.count(item)) for item in sorted(set(the_list))]
但是我调用这个函数几乎是一百万的时间,我需要尽可能快地完成它(python)。因此我的问题是:如何减少此功能的使用时间? (内存呢?)
我玩了一会儿,但没有什么明显的发现:
from timeit import Timer as T
number=10000
setup = "the_list=[5, 7, 6, 5, 5, 4, 4, 7, 5, 4]"
stmt = "[(item, the_list.count(item)) for item in sorted(set(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)
Out[230]: 0.058799982070922852
stmt = "L = []; \nfor item in sorted(set(the_list)): \n L.append((item, the_list.count(item)))"
T(stmt=stmt, setup=setup).timeit(number=number)
Out[233]: 0.065041065216064453
stmt = "[(item, the_list.count(item)) for item in set(sorted(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)
Out[236]: 0.098351955413818359
谢谢
克里斯托夫
【问题讨论】:
-
你用的是哪个python版本?
-
作为一名程序员,我不会问自己“我怎样才能让这件事花更少的时间?”但是“我怎样才能避免做一百万次呢?”您确定需要此函数的算法从一开始就在更大规模上是最优的吗?
-
如果你调用你的函数“几乎一百万次”,这将需要大约 5 秒——这真的有问题吗?
-
致 DGH:我在模拟扑克牌。根据循环内代码的复杂性(运行近百万次),我认为我不能对其进行矢量化,或者我可以避免在每个循环中至少调用一次 dupli。
-
致 Sven Marnach:这不是问题,因为这个扑克程序只是为了好玩,我只是借此机会学习更多 Python。但是,我很有可能会多次运行这 100 万手牌,或者我想要一个即时答案(例如,如果我并行在线玩)。
标签: python list performance count