Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取对象的最有效方法&x27;在python中,当对象位于列表中时,是否设置属性?_Python_Python 3.x - Fatal编程技术网

获取对象的最有效方法&x27;在python中,当对象位于列表中时,是否设置属性?

获取对象的最有效方法&x27;在python中,当对象位于列表中时,是否设置属性?,python,python-3.x,Python,Python 3.x,例如: 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.arra

例如:

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

无需使用numpy。以下是另一种解决方案:

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)
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)
它的价格是0:00:00.225412

---编辑2

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

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)
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)

这里不需要使用numpy,通常列表理解就足够了。也就是说,
l11=[v.atti1代表lst中的v]
完全可以

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

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

这会减慢速度,因为您首先使用理解构建列表,然后为np数组和副本重新分配内存

# 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)
这是更具可读性,pythonic,完全按照它说的做,而且速度更快。从内部来说,它的速度更快是因为对理解的低级别优化

另请注意,CPython(您很可能正在使用)从3.5(iirc)开始用于存储对象属性,从3.6开始,它与compact dict实现合并。两者协同工作——内存效率大大提升了原始性能


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

您可以使用
self.\uu dict\uu
在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'])

我很困惑。你到底想干什么?如果您试图评估一段Python代码的执行情况,请不要使用
datetime.now()
,而是使用专门为此设计的。1。你到底想达到什么目的?2.在这里使用
numpy
有什么意义?3.为什么你认为对于一个有一百万个对象的列表来说,
0:00:00.234735
速度很慢?无论如何改进此代码的一个方法是在一次过程中获取两个属性,而不是在整个过程中迭代两次list@DanielPryden许多模块的函数都会返回一个对象列表。我想知道获取对象姿态的最佳方法是什么。@没有必要的深度空间。我会编辑这个问题。谢谢。@DachuanZhao:英语两点我想澄清的术语。1.你说的是“态度”,但我想你实际上指的是“属性”。对吗?如果是,请在问题中澄清。2.你要求的是“最有效的方法”。你真的是指“有效”(例如,能够产生期望的效果)还是指“有效”(例如,以最小的工作量产生效果)?请澄清这一点,因为这将影响答案。这与问题有何关系?OP要求的是具有原始属性的列表,而不是命令。据我所知,最终目标是为两个不同的属性获得两个不同的列表。此方法创建对象属性的字典列表。一个列表理解或一个
映射
或甚至
熊猫。数据框
可用于以后创建两个不同的列表。从字面上看,熊猫解决方案的速度较慢。