【问题标题】:Dictionary Optimization字典优化
【发布时间】:2020-02-05 07:49:05
【问题描述】:

我正在尝试在字典中为我尝试制作的 AI 创建一个 q-table,但是在将大约 40,000,000 个可能的位置输入到 q-table(字典)后尝试制作字典时,该过程开始真正减速到大约 80,000,000 并且像蜗牛一样慢(大约需要 18 小时才能达到 80,000,000)并且似乎一直在减速。 我想知道是否有办法以某种方式优化我的字典或我的代码来加速这个过程,因为按照这个速度,完成 q-table 的创建需要一年的时间(大约 160,000,000 个职位)在 q 表上)。

如果有帮助,这是我的代码:

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)]

【问题讨论】:

  • 好像是4D数组。我认为您应该使用listndarray 列表,然后使用线程...?
  • np.random.unifor(-1, 0, size=3) 如果您对字典值是 ndarrays 没问题,可能会稍微快一些
  • GyuHyeon Choi:我愿意,但这样做会更容易,并且会长期帮助我,所以我不必每次都担心列表。
  • 如果您需要使用字典来存储值,您还可以考虑使用 Cython 或 Numba 使循环迭代非常快(或绕过 GIL)。

标签: python dictionary


【解决方案1】:

即使您只存储值(每个 64 位),对于 1600 * 1000 * 1000 * 3 的数组,您的 RAM 使用量也将接近 40 GB。添加 dict 的开销意味着您几乎肯定会用完 RAM。

检查您的页面文件是否正在上升(通过 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)。

【讨论】:

  • 所以我最好的选择是只对这种大小的数据使用列表,或者我也会遇到列表问题?
  • @LeonShams-Schaal 您可能会遇到任何数据类型的问题,除了可能是 Numpy 数组...事实上,我建议使用尺寸为 1600*1000* 的 32 位浮点数的 numpy 数组1000*3左右。这样一来,它只会占用大约 19 或 20 GB 的 RAM。
  • 如果我使用 numpy.random.uniform() 然后使用 size 创建一个如此大的列表,因为我知道它需要的大小,它会更好吗?
  • 我什至可以创建这样大小的数组吗?
  • @LeonShams-Schaal numpy.random.uniform() 是个好主意。我会更新答案。
猜你喜欢
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
  • 2017-06-26
  • 2018-06-11
  • 2013-12-29
  • 1970-01-01
相关资源
最近更新 更多