当前位置: 首页 > 知识库问答 >
问题:

为什么sorted(set(A))比set(sorted(A))快?

勾俊
2023-03-14

我有一个数组。我想对它们进行排序并删除重复项。这个答案建议使用setsort进行这种操作。运算的顺序不应该改变结果,所以我测量了计算的时间。

from numpy.random import randint
from time import clock

n = 1000000

A=randint(0,n,n)

t1=clock()
B=sorted(set(A))
t2=clock()
C=set(sorted(A))
t3=clock()

print t2-t1, t3-t2

>>> 0.48011 1.339263

是什么使一个比另一个快?还有,有没有更快的办法呢?

共有1个答案

祁景山
2023-03-14

这是因为当你打电话:

集(排序(A))

您正在对原始的完整列表进行排序,然后筛选出重复的值。然而,当您调用:

希望这有意义。

>>> A = [1,2,3,1,2,3,1,2,3,1,2,3]
>>> A = sorted(A)
[1,1,1,1,2,2,2,2,3,3,3,3]

>>> set(A)
{1, 2, 3}

On the other hand:

>>> A = [3,2,1,3,2,1,3,2,1,3,2,1]
>>> A = set(A)
{3, 2, 1}

>>> sorted(A)
{1, 2, 3}

正如@barmar所说,排序比删除重复项慢得多,因此,当您必须对一个小得多的列表进行排序时(在上面的示例中为列表的1/4),会有一个实时的时间增益

a = [1,2,3] * 10000

set(sorted(a)) --> 0.1890001297
sorted(set(a)) --> 0.0079998970
 类似资料:
  • 返回一组有序的元素。 语法 (Syntax) 以下是语法。 (sorted-set setofelements) Parameters - 'setofelements'是需要排序的元素集。 Return Value - 已排序的元素集。 例子 (Example) 以下是Clojure中排序集的示例。 (ns clojure.examples.example (:gen-class)) (

  • Generic animation of numbers Parameters anumberstartslave number Anumberendslave number bnumberstartmaster number (start time ingeneral case) Bnumberendmaster number (end time in generalcase) getfunct

  • 问题内容: 如果我尝试这样做: 我得到以下输出: 演示:http://codepad.org/ncVuJtJu 这是为什么? 我希望将其作为输出: 我的理解: 但是为什么不输出呢? 问题答案: 所有解释为什么得到2而不是1的答案实际上都是错误的。根据PHP文档,混合并以这种方式是不确定的行为,所以你可以得到1或2切换到不同版本的PHP可能会改变你得到的结果,这将是一样有效。 请参阅示例1,其中显示

  • 主要内容:1 Redis Hash,2 Redis Set,3 Redis Sorted set,4 Bitmap,5 HyperLogLog详细介绍了Redis的Hash、Set、Sorted set、Bitmap、HyperLogLog类型的常见命令和应用方式。 1 Redis Hash Redis Hash是一个String 类型的 field 和 value 的映射表,底层是Redis自己实现的dict字典结构,类似于JDK1.7前的 HashMap,内部采用数组+链表结构,采用链地址法

  • 问题内容: 我试图实施Miller- Rabin素数测试 ,并且对为什么中型数字(〜7位数字)花费如此长时间(> 20秒)感到困惑。我最终发现以下代码行是问题的根源: (其中,和都是相似的,但不相等的中号,是幂运算符,并且是模运算符) 然后,我尝试将其替换为以下内容: 相比之下,它几乎是瞬时的。 对于上下文,这是原始功能: 定时计算示例: 输出(与PyPy 1.9.0一起运行): 输出(在Pyth

  • 问题内容: 鉴于零比雷埃夫斯对另一个问题的回答,我们认为 在启用散列随机化的情况下,大约打印时间的85%。为什么是85%? 问题答案: 我假设这个问题的所有读者都读过: 零比雷埃夫斯的答案和 我对CPython词典的解释。 首先要注意的是,哈希随机化是由解释器启动决定的。 两组字母的哈希值都相同,因此唯一重要的是是否发生冲突(顺序会受到影响)。 通过第二个链接的推论,我们知道这些集合的支持数组从长