pat*_*eet 2 python performance
我正在努力做到
In [21]: l1 = range(1,1000000)
In [22]: l2 = range(100,90000)
In [23]: l1.append(101)
In [24]: print(set([x for x in l1 if l1.count(x) - l2.count(x) == 1]))
Run Code Online (Sandbox Code Playgroud)
在我的python shell中,这需要很长时间.一般来说,我的目标是在处理重复项时从第二个列表中减去列表.
例如
[1,2,2,3] - [2,3] = [1,2]
Run Code Online (Sandbox Code Playgroud)
我很高兴有任何提示如何在普通的单核机器上完成最多500毫秒的工作.
非订单保留使用collections.Counter:
from collections import Counter
a = Counter([1, 2, 2, 3])
b = Counter([2, 3])
res = list(a - b )
# [1, 2]
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为a的-方法Counter从输出中删除任何元素,其中存在的计数b等于或大于计数a.
使用a 保留订单OrderedCounter,然后手动生成列表,例如:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
pass
a = OrderedCounter([3, 2, 2, 1])
b = Counter([2, 3])
res = [k for k, v in a.items() if v - b[k] > 0]
# [2, 1]
Run Code Online (Sandbox Code Playgroud)
最后,如果原始范围包含非唯一值,并且您希望元素重复在减法后剩余的次数,则:
from collections import Counter, OrderedDict
class OrderedCounter(Counter, OrderedDict):
pass
a = OrderedCounter([3, 3, 2, 2, 2, 1])
b = Counter([2, 3])
res = [k for k, v in a.items() for _ in range(v - b[k])]
# [3, 2, 2, 1]
Run Code Online (Sandbox Code Playgroud)