【发布时间】:2021-10-04 10:58:17
【问题描述】:
让我们假设这个例子有两个类:
from timeit import Timer
from random import randint
import numpy as np
# Python version 3.8.3
class Value:
def __init__(self, val):
self.val = val
class Object:
def __init__(self):
self.d = dict()
self.counter = 0
def add_obj(self, obj):
self.d[self.counter] = obj
self.counter +=1
def return_val(self):
return self.d
obj = Object()
for _ in range(100000):
name = chr(np.random.randint(ord('a'), ord('z')))
info = Value(name)
obj.add_obj(info)
mydict = obj.return_val()
现在,我只想使用 next() 来搜索和检索 dict 中第一次出现的元素,否则返回 None。但是,我观察到 f1 和 f3 函数都比传统的 f2 方法慢得多。任何以更有效的方式执行此搜索的提示都值得赞赏。对于 f3 函数,我使用了此处提供的建议:Is next() in python really that fast?
def f1():
matched_elem = next((elem for elem in mydict.values() if str(elem.val) == 'a'), None)
return matched_elem
def f2():
for elem in mydict.values():
if 'a' == str(elem.val):
return elem
return None
def f3():
matched_elem = (elem for elem in mydict.values() if str(elem.val) == 'a')
if matched_elem is None:
return None
return next(matched_elem)
print(Timer(f1).timeit())
print(Timer(f2).timeit())
print(Timer(f3).timeit())
0.6597451590000001
0.397709414
0.682832415
【问题讨论】:
-
评论不用于扩展讨论;这个对话是moved to chat。