以最小的RAM负载加速复杂的计算

在用Python掌握ML,CNN,NN的过程中,新手几乎总是遇到计算速度问题,有时还缺少RAM。

对于大型数据库而言,这尤其明显,大型数据库的可用RAM大于50%。 购买更多体面铁的想法只是可能的解决方案之一。

使用Python中的功能之一的另一种选择是对函数本身进行迭代。

一个简单的说明性示例。 假设您需要在200,000度中构建从1到10的多个数字,并将它们的和相加。 结果,您应该获得一个20万个字符长的数字。 是Google的2倍

这是此功能的简单代码:

from time import time #    #      def power_1(x): power_1 = 0 start = time() power_1 = x**200000 end = time() total_1 = end - start return round(total_1,6) #   ,         power_1(1) + power_1(2) + power_1(3) + power_1(4) + power_1(5) + power_1(6) + power_1(7) + power_1(8) \ + power_1(9) + power_1(10) 

结果,我们为您的计算机提供了相当“昂贵”的操作,例如,我的操作花费了13毫秒以上。 但是,如果可以有很多这样的操作怎么办? 然后,一切变得复杂,也许您只是没有足够的RAM。

但是您可能会更棘手,并通过遍历变量来使用完全相同的函数。

这是具有相同功能的这种简单解决方案的代码:

 from time import time #   #   def power_2(): for i in range(11): yield i #     for i in power_2(): if i < 11: d = 0 total_2 = 0 start = time() d += i**200000 end = time() total_2 += end - start print('Ineration {} lasts {}'.format(i, round(total_2, 6))) if i == 10: print(' \n End with total time {} \n'.format(round(total_2,3))) 

我的电脑上花费的时间



差异为0.13-0.024 = 0.106毫秒!


如果一个人以通常的方式简单地将1加到这个庞大的数字上,那么与将自己提升到200,000度相比,这将花费更多的时间。 即,该方法的优点是显而易见的。

 def add_one(x): total_3 = 0 start = time() s = x + 1 end = time() total_3 += end - start print('Time to do add 1 to BIG number: {} \n'.format(total_3)) return print('Difference in time {}\n'.format(round(total_2 - total_3 ,3))) add_one(d) print('The size of the number {}!!!'.format(len(str(d)))) 

结果是这样的:



为什么这样 据我所知,在遍历一个函数时,Python不会在内存中创建临时对象,从而大大加快了任何计算过程。 因此,以这种方式重写功能-节省时间和精力。

总计-对于有限RAM大小的复杂计算,最好在函数上使用迭代,而不仅仅是函数本身。

我希望这可以帮助某人避免浪费宝贵的时间或不花钱购买其他快速老化的硬件。

受到演讲的启发

Source: https://habr.com/ru/post/zh-CN439312/


All Articles