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()
可能是速度的主要因素;有办法避免吗?