在python中,当对象位于列表中时,获取对象属性的最有效方法是什么?

2024-10-01 00:15:25 发布

您现在位置:Python中文网/ 问答频道 /正文

例如:

import numpy as np
import datetime

class Test():

    def __init__(self,atti1,atti2):
        self.atti1 = atti1
        self.atti2 = atti2


l1 = [Test(i,i+1) for i in range(1000000)]

我的解决方案是:

start_time = datetime.datetime.now()
l11 = np.array([v.atti1 for v in l1])
l12 = np.array([v.atti2 for v in l1])
print(datetime.datetime.now()-start_time)

在我的macbookpro2017中花费0:00:00.234735。你知道吗

有没有更有效的方法在python中实现它?你知道吗

---编辑1

没有必要使用努比。给你是另一种解决方案:

l11 = []
l12 = []

start_time = datetime.datetime.now()
for v in l1:
    l11.append(v.atti1)
    l12.append(v.atti2)
print(datetime.datetime.now()-start_time)

费用是0:00:00.225412

---编辑2

下面是一个糟糕的解决方案:

l11 = np.array([])
l12 = np.array([])
start_time = datetime.datetime.now()

for v in l1:
    l11 = np.append(l11,v.atti1)
    l12 = np.append(l12,v.atti2)
print(datetime.datetime.now()-start_time)

Tags: inselfl1fordatetimetimenparray
2条回答

可以使用self.__dict__返回Python中属性及其值的字典。你知道吗

import numpy as np
import datetime
import pandas as pd
class Test():
    def __init__(self,atti1,atti2):
        self.atti1 = atti1
        self.atti2 = atti2

    def getAttr(self):
        return self.__dict__


l1 = [Test(i,i+1).getAttr() for i in range(1000000)]

l1 = pd.DataFrame(l1)

l11 = list(l1['atti1'])
l12 = list(l1['atti2'])

这里不需要使用numpy,通常列表理解就足够了。也就是说l11 = [v.atti1 for v in lst]完全没问题。你知道吗

从概念上讲,您必须迭代所有对象并访问每个对象的属性。你知道吗

关于“为什么你不应该过度工程”的标准:

# numpy array builder
np.array([v.atti1 for v in lst])
np.array([v.atti2 for v in lst])
215 ms ± 3.69 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

这会变慢,因为您首先要理解地构建列表,然后为np数组和copy重新分配内存

# single list iteration with appending
l1 = []
l2 = []
for v in lst:
    l1.append(v.atti1)
    l2.append(v.atti2)
174 ms ± 384 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

更好,但有很多函数调用.append,最终分配和复制列表。你知道吗

# thing that you always start with, no pre-mature optimizations
l1 = [v.atti1 for v in lst]
l2 = [v.atti2 for v in lst]
99.3 ms ± 982 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

这是更具可读性,Python,做它说的,它的速度更快。在内部,它的速度更快,因为低层次的理解优化。你知道吗

请注意,从3.5开始的CPython(您很可能正在使用)使用shared-key dictionaries存储对象属性,从3.6开始,它与紧凑的dict实现合并。两者协同工作-内存效率会极大地提高您的原始性能。你知道吗

不确定VM在运行理解时是否真的利用了共享dict(可能没有),但在99%的情况下这必须留给VM优化。高级抽象语言(如python)实际上与微优化无关。你知道吗

相关问题 更多 >