如何进一步优化所有交叉和的计算?

时间:2018-09-29 09:15:50

标签: python python-3.x optimization

昨天我有一些空闲时间,以某种方式考虑过计算交叉和。 我的目标是计算所有给定数n之和。不要问为什么-它只是为了娱乐和学习东西。 所以对于n = 11,我希望我的结果看起来像这样:[1、2、3、4、5、6、7、8、9、1、2]

这是我的代码:

def dynamicCheckSumList(upperLimit):
    dynamicChecksumList = []
    for i in range(0, 10):
        dynamicChecksumList.append(i)
    for i in range(10, upperLimit+1):
        length = getIntegerPlaces(i)
        size = 10**(length-1)
        firstNumber = i // size
        ancestor = i-(firstNumber*size)
        newChecksum = firstNumber + dynamicChecksumList[ancestor]
        dynamicChecksumList.append(newChecksum)
    return dynamicChecksumList

首先,我创建一个空列表,然后用数字和它们各自的总和填充数字0-9。 然后,我查看所有9以上的数字,直到上限。得到他们的长度。然后,我继续找出该数字的第一位。之后,我计算出没有该前导数字的数字。例如:如果我的i为5432,我将得到432。由于我已经保存了432的和,所以我可以将这个和与我的前导数字相加,就可以了。

def getIntegerPlaces(theNumber):
    if theNumber <= 999999999999997:
        return int(math.log10(theNumber)) + 1
    else:
        counter = 15
        while theNumber >= 10**counter:
            counter += 1
        return counter

第二个功能是我在这里遇到的一个问题,该问题询问如何计算给定数字中的位数。

这里是否有任何方法(我想会有)来加快速度? 也将不胜感激将是有关如何节省内存的提示。为了好玩,我尝试将n设置为10亿。而且我的内存(16GB)爆炸了;)

1 个答案:

答案 0 :(得分:0)

def digitSums2(n):
    n = (n + 9) // 10 * 10 # round up to a multiple of 10
    result = bytearray(range(10))
    for decade in range(1, n//10):
        r_decade = result[decade]
        for digit in range(10):
            result.append(r_decade + digit)
    return result

有两个主要区别:

  • bytearray每个计算值使用一个字节,从而节省了大量内存。它只允许最多255个数字,但是对于少于26位数字的数字就足够了。
  • 剥开最后一个数字比剥开第一个数字要容易得多。

这在python中应该尽可能快。打印结果时要小心,因为它可能比计算本身要花更多的时间(尤其是在内存中进行复制)。