mquadri$ python3 -m timeit -s "l1 = [1,2,6,8]; l2 = [2,3,5,8];" "[x for x in l1 if x not in l2]"
500000 loops, best of 5: 489 nsec per loop
Daniel Pryden's生成器表达式,使用基于set的查找并键入强制转换到list-(每个循环583 nsec):按照OP的请求显式键入强制转换到list,以获得最终对象为^{。如果将生成器表达式替换为列表理解,则与相同Moinuddin Quadri's基于set查找的列表理解。
mquadri$ mquadri$ python3 -m timeit -s "l1 = [1,2,6,8]; l2 = set([2,3,5,8]);" "list(x for x in l1 if x not in l2)"
500000 loops, best of 5: 583 nsec per loop
mquadri$ python3 -m timeit -s "l1 = [1,2,6,8]; l2 = set([2,3,5,8]);" "list(filter(lambda x: x not in l2, l1))"
500000 loops, best of 5: 681 nsec per loop
性能比较
比较python3.9.1和python2.7.16上这里提到的所有答案的性能
Python 3.9.1
答案按性能顺序列出:
Arkku's
set
使用减法进行差分“-”运算-(每个循环91.3纳秒)Moinuddin Quadri's使用
set().difference()
-(每个环路133毫微秒)Moinuddin Quadri's基于
set
查找的列表理解-(每个循环366nsec)Donut's普通列表上的列表理解-(每个循环489纳秒)
Daniel Pryden's生成器表达式,使用基于。如果将生成器表达式替换为列表理解,则与相同Moinuddin Quadri's基于
set
的查找并键入强制转换到list
-(每个循环583 nsec):按照OP的请求显式键入强制转换到list,以获得最终对象为^{set
查找的列表理解。Moinuddin Quadri's使用
filter()
并显式键入转换到list
(需要显式键入转换,如Python3.x中所示,它返回迭代器)(每个循环681nsec)Akshay Hazari's使用>-(每个循环3.36 usec) 的组合:从Python 3.x显式键入casting到
functools.reduce
+^{list
,它开始返回迭代器。我们还需要导入functools
以在Python 3.x中使用reduce
Python 2.7.16
答案按性能顺序列出:
Arkku's
set
使用减法进行差分“-”运算-(每个循环0.0783 usec)Moinuddin Quadri's使用
set().difference()
-(每个循环0.117 usec)Moinuddin Quadri's基于
set
查找的列表理解-(每个循环0.246 usec)Donut's普通列表上的列表理解-(每个循环0.372 usec)
Moinuddin Quadri's使用
filter()
-(每个循环0.593usec)Daniel Pryden's生成器表达式,使用基于。如果将生成器表达式替换为列表理解,则它将与{a2}使用基于
set
的查找并键入强制转换到list
-(每个循环0.964个):按照OP的请求显式键入强制转换到list以获得最终对象^{set
的查找进行列表理解。Akshay Hazari's使用
functools.reduce
+filter
-(每个循环2.78 usec)Python有一个名为List Comprehensions的语言特性,非常适合使这类事情变得非常简单。下面的语句完全按照您的要求执行,并将结果存储在
l3
:l3
将包含[1, 6]
一种方法是使用集合:
但是,请注意,集合不会保留元素的顺序,并会导致删除任何重复的元素。元素还需要是可散列的。如果这些限制是可以容忍的,那么这通常可能是最简单、性能最高的选项
相关问题 更多 >
编程相关推荐