python内存怎么存方法_python中在内存中保存和处理大dict的有效方法

至少有两种可能性:

数组

你可以试着用两个数组。一个用于键,一个用于值,这样索引(键)==索引(值)

更新于2017-01-05:在数组中使用4字节整数。

数组将使用更少的内存。在使用clang编译的python的64位FreeBSD机器上,3000万个整数的数组使用大约117 MiB。

以下是我使用的python命令:Python 2.7.13 (default, Dec 28 2016, 20:51:25)

[GCC 4.2.1 Compatible FreeBSD Clang 3.8.0 (tags/RELEASE_380/final 262564)] on freebsd11

Type "help", "copyright", "credits" or "license" for more information.

>>> from array import array

>>> a = array('i', xrange(30000000))

>>> a.itemsize

4

导入数组后,ps报告:USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND

rsmith 81023 0.0 0.2 35480 8100 0 I+ 20:35 0:00.03 python (python2.7)

制作阵列后:USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND

rsmith 81023 29.0 3.1 168600 128776 0 S+ 20:35 0:04.52 python (python2.7)

常驻设置大小以1 KiB为单位报告,因此(128776-8100)/1024=117 MiB

通过列表理解,您可以很容易地得到一个索引列表,其中的键满足特定条件。然后可以使用该列表中的索引来访问相应的值。。。

numpy

如果您有可用的numpy,那么使用它会更快,具有更多的功能,并且使用的RAM会稍微少一些:Python 2.7.5 (default, Jun 10 2013, 19:54:11)

[GCC 4.2.1 Compatible FreeBSD Clang 3.1 ((branches/release_31 156863))] on freebsd9

Type "help", "copyright", "credits" or "license" for more information.

>>> import numpy as np

>>> a = np.arange(0, 30000000, dtype=np.int32)

从ps:启动Python后6700kib,导入numpy后17400kib,创建数组后134824kib。大约114兆字节。Python 2.7.5 (default, Jun 10 2013, 19:54:11)

[GCC 4.2.1 Compatible FreeBSD Clang 3.1 ((branches/release_31 156863))] on freebsd9

Type "help", "copyright", "credits" or "license" for more information.

>>> import numpy as np

>>> a = np.zeros((10,), dtype=('i4,i4'))

>>> a

array([(0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0),

(0, 0), (0, 0)],

dtype=[('f0', '

>>> a.dtype.names

('f0', 'f1')

>>> a.dtype.names = ('key', 'value')

>>> a

array([(0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0),

(0, 0), (0, 0)],

dtype=[('key', '

>>> a[3] = (12, 5429)

>>> a

array([(0, 0), (0, 0), (0, 0), (12, 5429), (0, 0), (0, 0), (0, 0), (0, 0),

(0, 0), (0, 0)],

dtype=[('key', '

>>> a[3]['key']

12

在这里您可以分别访问键和值>>> a['key']

array([ 0, 0, 0, 12, 0, 0, 0, 0, 0, 0], dtype=int32)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值