【发布时间】:2018-10-02 01:21:32
【问题描述】:
在 python 中创建包含整数/浮点数(非常简单的数据类型)的类列表对象的最快方法是什么?
“类似列表”是什么意思?
这意味着我想要一个支持列表的两个(非常)基本操作的对象:获取某个索引中的对象 (1) 并更改其值 (2)。
在发布此之前我遇到了哪些帖子,为什么他们没有解决我的问题?
他们没有解决我的问题,因为他们的所有解决方案都太慢了:在我的 PC 中 array.array('i',(0,)*10 ** 8) 导致错误(笑); [0 for _ in range(10**8)] 花了大约 15 秒(哇!); [0] * 10 ** 8 耗时 2.3 秒; [None] * 10 ** 8 耗时 1.8 秒; (1.8 秒可能会更快...)
我做了什么?
我尝试使用ctypes 模块
from ctypes import c_int
array = (c_int * 10 ** 8)()
上面的代码只用了 0.7 秒……但是有没有办法让它更快?除了速度快之外,它还有一些缺点:
- 由于它使用 c/c++ 变量的骨架,因此其中的整数将处于“不像 python 那样无限”的整数值范围内
- 列表中不能有多个数据类型
- 您必须导入一个模块才能使用它
真的可以按照我的要求去做吗?有没有比使用ctypes 模块更快的方法?如果是这样,请确保您使用的是“内置”/“预安装”模块。
编辑:
为什么我不能简单地安装一些模块,比如 numpy?
我正在使用 python 进行竞争性编程,大多数解释器/评委不允许使用外部库。
我们可以用array.array 存储自定义对象吗?
我可以看到很多答案都使用了array 模块的array 函数。他们都使用'i'来指定我们要存储整数。是否可以创建一个类并创建一个包含它的“array.array”?例如:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
# make array.array object with all indexes containing a Point with atributes x and y with value 0
# an example with a list of what I want to do is this:
# l = [Point(0, 0) for _ in range(10**3)]
【问题讨论】:
-
你考虑过
numpy吗?如果您谈论的是大型数值计算的性能,则不必担心导入模块。见Why NumPy instead of Python lists? -
你也有
bytearray(10**8)。值的范围有限(0-255),但速度非常快