栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

为什么Python的数组变慢?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Python的数组变慢?

存储
是“未装箱的”,但是每次访问元素时,Python都必须对其进行“装箱”(将其嵌入常规Python对象中)以便对其进行任何处理。例如,您

sum(A)
遍历数组,并将每个整数一次装在一个常规Python
int
对象中。那要花时间。在中
sum(L)
,所有装箱操作均在创建列表时完成。

因此,最后,阵列通常较慢,但所需的内存却少得多。


这是最新版本的Python 3的相关代码,但是自Python首次发布以来,相同的基本思想也适用于所有CPython实现。

这是访问列表项的代码:

PyObject *PyList_GetItem(PyObject *op, Py_ssize_t i){        return ((PyListObject *)op) -> ob_item[i];}

它几乎没有什么:

somelist[i]
只返回
i
列表中的第一个对象(并且CPython中的所有Python对象都是指向结构的指针,该结构的初始段符合的布局
structPyObject
)。

__getitem__
array
带有类型代码的实现
l

static PyObject *l_getitem(arrayobject *ap, Py_ssize_t i){    return PyLong_FromLong(((long *)ap->ob_item)[i]);}

原始内存被视为平台本地

C
long
整数的矢量;该
i
“个
C long
被读取起来;
然后
PyLong_FromLong()
调用该方法将本机包装(“框”)
C long
在Python
long
对象中(在Python
3中,该对象消除了Python 2
int
和之间的区别
long
,实际上显示为type
int
)。

这种装箱必须为Python

int
对象分配新的内存,然后将native
Clong
的位喷射到其中。在原始示例的上下文中,此对象的生存期非常短(足够长,足以
sum()
将内容添加到正在运行的总计中),然后需要更多的时间来取消分配新
int
对象。

这就是速度差异的来源,在CPython实现中,总是如此,而且总是如此。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/653624.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号