例如:
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)
可以使用
self.__dict__
返回Python中属性及其值的字典。你知道吗这里不需要使用numpy,通常列表理解就足够了。也就是说
l11 = [v.atti1 for v in lst]
完全没问题。你知道吗从概念上讲,您必须迭代所有对象并访问每个对象的属性。你知道吗
关于“为什么你不应该过度工程”的标准:
这会变慢,因为您首先要理解地构建列表,然后为np数组和copy重新分配内存
更好,但有很多函数调用
.append
,最终分配和复制列表。你知道吗这是更具可读性,Python,做它说的,它的速度更快。在内部,它的速度更快,因为低层次的理解优化。你知道吗
请注意,从3.5开始的CPython(您很可能正在使用)使用shared-key dictionaries存储对象属性,从3.6开始,它与紧凑的dict实现合并。两者协同工作-内存效率会极大地提高您的原始性能。你知道吗
不确定VM在运行理解时是否真的利用了共享dict(可能没有),但在99%的情况下这必须留给VM优化。高级抽象语言(如python)实际上与微优化无关。你知道吗
相关问题 更多 >
编程相关推荐