我正在尝试找到一种最有效的方式来构建带有if条件的两个单独列表,以评估从函数返回的布尔值。
trunc_keys列表包含的字符串元素不超过15个。测试使用10个元素进行。
常用功能:
fig = sns.barplot(x="original_language", y=train.id.count(), data=train)
方法1:
def is_trunc(key):
# about 10 lines of string manipulation that ultimately returns boolean
方法2:
trunc_key_list = [key for key in trunc_keys if is_trunc(key)]
bad_key_list = [key for key in trunc_keys if not is_trunc(key)]
我使用trunc_key_list = []
bad_key_list = []
[trunc_key_list.append(key) if is_trunc(key) else bad_key_list.append(key) for key in trunc_keys]
和start_time = time.time()
来计时结果
结果(平均20次运行)
方法1 :0.000411 方法2 :0.000280
我希望方法1更快。我认为列表理解是避免此类实例化的理想选择,因为无需实例化空列表。我发现此线程似乎支持此结果: Python list() vs list comprehension building speed
我对python还是相当陌生,并且希望更好地理解这一点。这么小的列表大小,列表理解是否不会变得有利?我还想念其他东西吗?
感谢您的见解,谢谢!
答案 0 :(得分:1)
如果您注意到我们可以计算每条语句执行的时间:
让L为列表的长度
is_trunc(key)
-运行L * 2 append(key)
-运行L * 0 is_trunc(key)
-运行L * 1 append(key)
-运行L * 1 在此post中,我们可以看到平均追加时间为:
~115 μs or 0.000115 seconds
0.000411 / 2 = 0.0002055
0.000280 - 0.000115 = 0.000165
然后我们可以减去方法1的总时间和方法2的总时间,得出:
0.0002055 - 0.000165 = 0.0000405
0.0000405 * 2 = 0.000081
0.000081 基本上可以忽略不计。因此,循环的运行速度几乎完全相同,但是在第一种方法中,您对列表进行了两次迭代,因此花费了两倍的时间。
带走:is_trunc(key)
太贵了!你在那里做什么? :)