sey*_*ood 4 python for-loop list
我正在尝试提高采用列表的脚本的效率,并计算在另一个"主"列表中没有多少项(list_of_all_items).
感觉可能有一种更有效的方式来做到这一点,也许是通过某种方式结合查询?
purple_count, brown_count, blue_count = 0, 0, 0
for item in list_of_purple_items:
if item not in list_of_all_items:
purple_count += 1
for item in list_of_brown_items:
if item not in list_of_all_items:
brown_list += 1
for item in list_of_blue_items:
if item not in list_of_all_items:
blue_count += 1
Run Code Online (Sandbox Code Playgroud)
编辑:
谢谢你的帮助.我进行了快速测试,看看使用大型测试用例的最佳方法是什么:
my original: 30.21s
sets: 00.02s
filter: 30.01s
sum generator: 31.08s
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是它使用套装效率更高.
再次感谢所有人.
Mar*_*ers 13
使用集合,因此您不必保持循环:
set_of_all_items = set(list_of_all_items)
purple_count = len(set(list_of_purple_items).difference(list_of_all_items))
brown_count = len(set(list_of_brown_items).difference(list_of_all_items))
blue_count = len(set(list_of_blue_items).difference(list_of_all_items))
Run Code Online (Sandbox Code Playgroud)
这样效率要高得多,因为设置交叉点只需要在所涉及的两个集合之一上进行循环; 然后可以在恒定时间内针对另一组测试每个项目.循环在C代码中完成(在创建set对象时和计算差异时).
对于所有项目使用集合并不是真正需要set.difference()任何可迭代的,但它稍微快一点:
>>> import timeit
>>> import random
>>> all = range(10000)
>>> random.shuffle(all)
>>> all[:-1000] = []
>>> some = [random.randrange(10000) for _ in range(1000)]
>>> timeit.timeit('len(set(some).difference(all))', 'from __main__ import some, all', number=10000)
0.9517788887023926
>>> timeit.timeit('len(set(some).difference(all))', 'from __main__ import some, all; all = set(all)', number=10000)
0.90407395362854
Run Code Online (Sandbox Code Playgroud)