【发布时间】:2019-10-04 01:12:18
【问题描述】:
我想实现一个to_dict 函数,它的行为类似于内置的__dict__ 属性,但允许我拥有自定义逻辑。 (用于构建pandas DataFrame,见下例)
但是我发现我的 to_dict 函数比 __dict__ 慢约 25%
即使他们做同样的事情。如何改进我的代码?
class Foo:
def __init__(self, a,b,c,d):
self.a = a
self.b = b
self.c = c
self.d = d
def to_dict(self):
return {
'a':self.a,
'b':self.b,
'c':self.c,
'd':self.d,
}
list_test = [Foo(i,i,i,i)for i in range(100000)]
%%timeit
pd.DataFrame(t.to_dict() for t in list_test)
# Output: 199 ms ± 4.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
pd.DataFrame(t.__dict__ for t in list_test)
# Output: 156 ms ± 948 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
这个问题离题了,但与我的最终目标有关:从自定义对象列表构造 pandas DataFrame 的最有效方法是什么?我目前的做法取自https://stackoverflow.com/a/54975755/1087924
【问题讨论】:
-
他们做的事情并不完全相同。
to_dict每次都会创建一个新对象,而t.__dict__已经存在。 -
在创建
Foo的实例时生成dict对象,并在值更新时更新它。然后在to_dict上,您返回对象,而不是在每次调用时生成它。应该更快。 -
注意,
__dict__不是函数,它只是一个包含该对象的命名空间的属性。
标签: python pandas performance class