Python 字典优化

Python 字典优化,python,dictionary,Python,Dictionary,我试图在字典中为我试图制作的人工智能创建一个q表,但在将大约40000000个可能的位置输入到q表(dicitonary)后,当我试图制作字典时,该过程开始真正放缓,速度约为80000000,并像蜗牛一样缓慢(大约18小时达到80000000)而且似乎一直在减速。 我想知道是否有办法以某种方式优化我的字典或代码以加快这一过程,因为按照这个速度,完成q表的创建(q表上大约160000000个位置)需要一年的时间 以下是我的代码(如果有帮助): start_q_table = None if st

我试图在字典中为我试图制作的人工智能创建一个q表,但在将大约40000000个可能的位置输入到q表(dicitonary)后,当我试图制作字典时,该过程开始真正放缓,速度约为80000000,并像蜗牛一样缓慢(大约18小时达到80000000)而且似乎一直在减速。 我想知道是否有办法以某种方式优化我的字典或代码以加快这一过程,因为按照这个速度,完成q表的创建(q表上大约160000000个位置)需要一年的时间

以下是我的代码(如果有帮助):

start_q_table = None

if start_q_table is None:
    q_table = {}
    # All possible height differences between the bird and the bottom pipe
    for i in range(-display_height, display_height):
               #     ^^^ = -800         ^^^ = 800
        # All possible distances between the bird and the end of the nearest pipe
        for ii in range(-bird_size, display_height + pipe_distance):
                     #    ^^^ = 15     ^^^ = ~ 1000 total
            # Bird speed
            for iii in speed_range:
              #           ^^^ = range(1000)
                q_table[(i, ii, iii)] = [np.random.uniform(-1, 0) for i in range(3)]

即使您只存储这些值(每个值64位),对于1600*1000*1000*3阵列,您的RAM使用量也将达到接近40GB。加上dict的开销意味着几乎肯定会耗尽内存

检查页面文件是否正在上升(在Windows上通过Ctrl+Alt+Del、Mac上的活动监视器或Linux上的
free
命令可见)

从技术上讲,你可以增加你的记忆来弥补,但你可能需要很多

下面是我的机器上的一个示例:

import numpy
v = numpy.zeros([1600, 1000, 1000, 3], dtype='float32')
for i in xrange(1600):
    v[i, :, :, :] = numpy.random.uniform([1000, 1000, 3])

这在我的系统上花费了10.4秒和大约19 GB的RAM(它有40 GB的RAM和3.6 GHz的CPU)。

这里有一些想法:它似乎是4D阵列。我认为您应该使用at list
list
ndarray
和threading…?
np.random.unifor(-1,0,size=3)如果你的字典值是NDARRAYSGYYHEYON CUI,那么,可能会稍微快一点:我会这样做,但是这样做会更容易,并且对我有很长的帮助,所以我不必每次都担心列表。你也可以考虑使用Cython或NoMBA使循环迭代非常快(或者绕过吉尔)。如果你需要使用字典来存储值。那么我最好的选择就是只使用一个列表来存储这种大小的数据,或者我在列表中也会遇到这个问题吗?@LeonShams Schaal你可能会遇到任何数据类型的问题,除了可能的Numpy数组之外。。。事实上,我建议使用一个32位浮点的numpy数组,其大小为1600*1000*1000*3左右。这样只会占用19或20 GB的内存。如果我使用numpy.random.uniform()然后使用size创建一个如此大的列表,效果会更好吗?因为我知道它需要的大小?我甚至可以创建这样大小的数组吗?@LeonShams Schaal
numpy.random.uniform()
是个好主意。我会更新答案。