Python 创建唯一项目列表的快速方法
我实现了一个创建词汇表的代码,如下所示Python 创建唯一项目列表的快速方法,python,python-3.x,Python,Python 3.x,我实现了一个创建词汇表的代码,如下所示q和a是字符串列表和s是字符串列表。虽然它正在工作,但速度非常慢,因为数据相当大。我认为这个代码不是很聪明 你认为有什么方法可以优雅地实施吗 vocab = functools.reduce(lambda x, y: x | y, (set(list(chain.from_iterable(s)) + q + a) for s, q, a in data)) 我编写了一个简单的程序来测试这段代码。如下所示,数据长度在实际数据集中相当大 import t
q
和a
是字符串列表
和s
是字符串列表
。虽然它正在工作,但速度非常慢,因为数据相当大。我认为这个代码不是很聪明
你认为有什么方法可以优雅地实施吗
vocab = functools.reduce(lambda x, y: x | y, (set(list(chain.from_iterable(s)) + q + a) for s, q, a in data))
我编写了一个简单的程序来测试这段代码。如下所示,数据
长度在实际数据集中相当大
import time
import functools
from itertools import chain
s1 = [
['a', 'b', 'fwa'], # actual length is around 10
['foo', 'ixb', 'fwa'],
['fj', 'fab', 'fwa']
]
q1 = ['fwa', 'fawh'] # actual length is around 10
a1 = ['fjj', 'jfaw'] # actual length is around 3
data = []
for i in range(10000000):
data.append((s1, q1, a1))
start = time.time()
vocab = functools.reduce(lambda x, y: x | y, (set(list(chain.from_iterable(s)) + q + a) for s, q, a in data)) # my way
elapsed_time = time.time() - start
print(elapsed_time) # 11.522738695144653
print(vocab)
start = time.time()
vocab = functools.reduce(lambda x, y: x | y, (set(chain(chain.from_iterable(s), q, a)) for s, q, a in data)) # @cowbert
elapsed_time = time.time() - start
print(elapsed_time) # 9.918306350708008
print(vocab)
你能提供样本输入和输出吗?很难理解…我写了一个简单的代码。对不起,误读了这个问题(删除的评论)。如果是嵌套链
导致问题,您是否可以尝试使用嵌套+
?像set(列表(chain(chain.from_iterable,q,a))
?@cowbert显示我的更新代码。快一点。我认为避免reduce
和|
可能是更好的性能。有了这么多的元素,reduce()
可能是速度的主要因素;有没有办法避免这种情况?您能提供示例输入和输出吗?很难理解…我写了一个简单的代码。对不起,误读了这个问题(删除的评论)。如果是嵌套链
导致问题,您是否可以尝试使用嵌套+
?像set(列表(chain(chain.from_iterable,q,a))
?@cowbert显示我的更新代码。快一点。我认为避免reduce
和|
可能是更好的性能。有了这么多的元素,reduce()
可能是速度的主要因素;有办法避免吗?