加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

在python中创建包含整数的类似列表的对象的最快方法

发布时间:2020-12-20 12:14:11 所属栏目:Python 来源:网络整理
导读:在 python中创建包含整数/浮点数(非常简单的数据类型)的类似列表的对象的最快方法是什么? ?“列表式”是什么意思? 这意味着我想拥有一个支持列表的两个(非常)基本操作的对象:获取某个索引(1)中的对象并更改其值(2). ?在发布此帖之前我遇到了什么帖子,为什
在 python中创建包含整数/浮点数(非常简单的数据类型)的类似列表的对象的最快方法是什么?

?“列表式”是什么意思?

这意味着我想拥有一个支持列表的两个(非常)基本操作的对象:获取某个索引(1)中的对象并更改其值(2).

?在发布此帖之前我遇到了什么帖子,为什么他们没有解决我的问题?

我遇到了这两个:[1] [2]

他们没有解决我的问题,因为他们的所有解决方案都太慢了:在我的PC阵列中.阵列(‘i’,(0,)* 10 ** 8)导致错误(lol); [范围(10 ** 8)中的[0]花了大约15秒(哇!); [0] * 10 ** 8耗时2.3秒; [无] * 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存储自定义对象吗?

我可以看到很多答案都使用了数组模块的数组功能.他们都使用’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)]

解决方法

array.array('i',) * 10**8) resulted in an error (lol)

你没有指定你得到的错误 – 这对我有用,虽然它不是很快,因为它构建了一个中间元组并立即丢弃它.使用Python的内置类型,如果你避免使用元组,array.array可能会产生最佳性能:

a = array.array('i',)) * 10**8

The code above took only 0.7 seconds … but is there a way to make it faster?

如果不允许创建或导入C扩展,那将很难击败array.array.在我几年前的机器上,上面需要0.6秒.您可以通过增加初始数组的大小来进一步优化它.例如,这会产生相同的结果,但几乎快3倍(!):

# 0.22 s
a = array.array('i',) * 10) * 10**7

在我的机器上,以下版本效果最佳:

# 0.19 s
a = array.array('i',) * 100) * 10**6

进一步增加初始阵列大小并没有帮助,很快就会开始降低性能.

为了获得更高的效率,请考虑其他方法,例如惰性列表或为您的用例量身定制的完全不同的数据结构.鉴于竞争的背景,这可能是实际上正在寻求的.

但请注意,每种解决方案都会有不同的权衡.例如,像@KonstantinNikitin提供的惰性数组将非常有效地构造,但是在纯Python中实现的__getitem__和__setitem__将比list或array.array慢几个数量级.对您来说哪个更好,归结为您的计划中更频繁的操作,这取决于您找出答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读