Python-如何一次创建多个对象?

Python-如何一次创建多个对象?,python,object,initialization,Python,Object,Initialization,有没有办法在Python中一次创建多个对象 比方说,我想用1.000.000个对象实例填充一个列表。有没有办法在一次调用中创建对象,而不是在循环中逐个初始化对象 一个接一个地迭代需要一些时间,我正在寻找一种方法,而不是运行许多线程来减少这一时间 我的Python之旅是一个月前开始的,所以我不知道有很多Python特有的技巧。如何处理这个问题有什么提示吗 在for循环或list comp中,必须迭代N次才能生成N个对象 objectList = [object() for _ in range(1

有没有办法在Python中一次创建多个对象

比方说,我想用1.000.000个对象实例填充一个列表。有没有办法在一次调用中创建对象,而不是在循环中逐个初始化对象

一个接一个地迭代需要一些时间,我正在寻找一种方法,而不是运行许多线程来减少这一时间


我的Python之旅是一个月前开始的,所以我不知道有很多Python特有的技巧。如何处理这个问题有什么提示吗

在for循环或list comp中,必须迭代N次才能生成N个对象

objectList = [object() for _ in range(1000000)]
例如,建立
int

intList = [int() for _ in range(1000000)]
对于10个
int
的小列表:

>>> [int() for _ in range(10)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

在for循环或list comp中,必须迭代N次以生成N个对象

objectList = [object() for _ in range(1000000)]
例如,建立
int

intList = [int() for _ in range(1000000)]
对于10个
int
的小列表:

>>> [int() for _ in range(10)]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
增加

如果您希望预先分配列表,以避免在列表继续增长时重新分配列表的开销,则此构造是适当的,因为它将为列表分配整个内存,并使用相同的对象初始化列表的每个成员

如果需要将每个成员初始化为不同的对象,则必须通过循环、列表理解等单独初始化每个列表元素

Windows下的内存重新分配往往比基于Unix的系统慢一些,因此这种方法比简单地初始化循环要快,因为这种构造以本机速度运行

增加

如果您希望预先分配列表,以避免在列表继续增长时重新分配列表的开销,则此构造是适当的,因为它将为列表分配整个内存,并使用相同的对象初始化列表的每个成员

如果需要将每个成员初始化为不同的对象,则必须通过循环、列表理解等单独初始化每个列表元素


Windows下的内存重新分配往往比基于Unix的系统下的内存重新分配慢一些,因此这种方法比简单地初始化循环要快,因为这种构造以本机速度运行。

我将使用生成器:

>>> def obj(x):
...    print 'obj called with', x
...    return x
... 
>>> gen=(obj(x) for x in xrange(10))
注意,此时,
obj
尚未被调用。一旦您实际转换为列表(或者更好的是,对其进行迭代),将依次创建对象:

>>> list(gen)
obj called with 0
obj called with 1
obj called with 2
obj called with 3
obj called with 4
obj called with 5
obj called with 6
obj called with 7
obj called with 8
obj called with 9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

我会使用发电机:

>>> def obj(x):
...    print 'obj called with', x
...    return x
... 
>>> gen=(obj(x) for x in xrange(10))
注意,此时,
obj
尚未被调用。一旦您实际转换为列表(或者更好的是,对其进行迭代),将依次创建对象:

>>> list(gen)
obj called with 0
obj called with 1
obj called with 2
obj called with 3
obj called with 4
obj called with 5
obj called with 6
obj called with 7
obj called with 8
obj called with 9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]


如果在使用对象时懒洋洋地创建它们,而不是从一开始就创建它们,那会怎么样?例如,一些软件包(如numpy)可以让您快速创建大型阵列,但一般来说,您必须一次创建一个。像
[MyClass(x)for x in range(1000000)]
这样的列表理解往往比for循环更快,因为名称查找更少。是否有足够的内存来容纳1000000个对象?什么样的后处理?他们能一一处理吗?是否需要随机访问任何对象?什么样的东西?它们是可静音的还是不可变的?它们在创建时是否依赖于X的某个值?是否需要搜索它们以查找值?您需要能够订购或保存它们吗?是否需要在X位置插入值?它们是否保持唯一(像一个集合)?有一个包含一些数据的N个对象的现有列表,通过为每个现有对象创建一个BLL对象,这些对象将被解析为JSON并返回。不需要随机访问,我正在寻找一种解决方案,通过创建N BLL来提高解析过程。认为质量对象分配之类的东西可以工作。VTR。这个问题和链接的副本都是关于对象列表的,但是这个问题是关于对象的,而另一个问题是关于列表的。那么在使用对象时懒洋洋地创建对象,而不是从一开始就创建对象呢?例如,一些软件包(如numpy)可以让您快速创建大型阵列,但一般来说,您必须一次创建一个。像
[MyClass(x)for x in range(1000000)]
这样的列表理解往往比for循环更快,因为名称查找更少。是否有足够的内存来容纳1000000个对象?什么样的后处理?他们能一一处理吗?是否需要随机访问任何对象?什么样的东西?它们是可静音的还是不可变的?它们在创建时是否依赖于X的某个值?是否需要搜索它们以查找值?您需要能够订购或保存它们吗?是否需要在X位置插入值?它们是否保持唯一(像一个集合)?有一个包含一些数据的N个对象的现有列表,通过为每个现有对象创建一个BLL对象,这些对象将被解析为JSON并返回。不需要随机访问,我正在寻找一种解决方案,通过创建N BLL来提高解析过程。认为质量对象分配之类的东西可以工作。VTR。这个问题和链接的副本都是关于对象列表的,但是这个问题是关于对象的,而另一个问题是关于列表的。这会更快吗?@martineau:这是正确的问题,但是OP没有真正指定可以让人确定的信息。看到我在帖子上的问题了……这会更快吗?@martineau:这是一个正确的问题,但OP并没有具体说明可以让人决定的信息。查看我在帖子上的问题…如果所有对象都不是
None
或不完全相同,该怎么办?请参阅你问这个问题时我显然在键入的说明。如果所有对象都不是
None
或不完全相同,该怎么办?请参阅你问这个问题时我显然在键入的说明。