比较Python整数

比较Python整数,python,types,Python,Types,我有一个1000以下的整数列表和一个哈希函数,将其转换为单个整数,但要大得多。下面有一个哈希函数代码: def hash_function(lst): hsh = 0 for i, item in enumerate(lst): hsh += item * pow(10, i * 3) return hsh 假设lst有大约4-5个项目。 比较两个整数是否比比较两个小得多的整数列表更有效?为什么?我必须比较数十万个哈希值。我想出了一个快速测试来显示内置列

我有一个1000以下的整数列表和一个哈希函数,将其转换为单个整数,但要大得多。下面有一个哈希函数代码:

def hash_function(lst):
    hsh = 0
    for i, item in enumerate(lst):
        hsh += item * pow(10, i * 3)
    return hsh
假设
lst
有大约4-5个项目。
比较两个整数是否比比较两个小得多的整数列表更有效?为什么?我必须比较数十万个哈希值。

我想出了一个快速测试来显示内置列表比较和哈希函数之间的差异

import time
import random
import sys
def compareRegular(a, b):
    return a == b

def listHash(lst):
    hsh = 0
    for i, item in enumerate(lst):
        hsh += item * pow(10, i * 3)
    return hsh

def compareHash(a, b):
    return listHash(a) == listHash(b)

def compareLists(hugeList, comparison):
    output = []
    for i, lstA in enumerate(hugeList[:-1]):
        for j, lstB in enumerate(hugeList[i + 1:]):
            if comparison(lstA, lstB):
                output.append([i, j])
    return output

def genList(minValue, maxValue, numElements):
    output = []
    for _ in range(1000):
        smallList = []
        for _ in range(numElements):
            smallList.append(random.randint(minValue, maxValue))
        output.append(smallList)
    return output

random.seed(123)
hugeListA = genList(-sys.maxint - 1, sys.maxint, 5)
hugeListB = genList(0, 100, 5)

print "Test with huge numbers in our list"
start = time.time()
regularOut = compareLists(hugeListA, compareRegular)
end = time.time()
print "Regular compare takes:", end - start

start = time.time()
hashOut = compareLists(hugeListA, compareHash)
end = time.time()
print "Regular compare takes:", end - start
print "Are both outputs the same?", regularOut == hashOut
print

print "Test with smaller number in our lists"
start = time.time()
regularOut = compareLists(hugeListB, compareRegular)
end = time.time()
print "Regular compare takes:", end - start

start = time.time()
hashOut = compareLists(hugeListB, compareHash)
end = time.time()
print "Regular compare takes:", end - start
print "Are both outputs the same?", regularOut == hashOut
在我的计算机上,此输出:

Test with huge numbers in our list
Regular compare takes: 0.0940001010895
Regular compare takes: 3.38999986649
Are both outputs the same? True

Test with smaller number in our lists
Regular compare takes: 0.0789999961853
Regular compare takes: 3.01400017738
Are both outputs the same? True
开发python的人肯定会花很多时间思考这样的事情。我个人不知道内置列表比较实际上是如何工作的,但我非常确定它不会像哈希函数那样在Python解释器中执行。许多python内置函数和类型都由本机执行的C代码支持,列表比较函数可能属于这一类


即使您以类似的方式实现了hash函数,并以本机方式执行,它也可能会更慢。您基本上看到了N个调用
pow
或N个数字比较。即使它们是可变大小的整数,
memcmp
肯定不会比从内存加载相同的值和对其执行浮点运算花费更长的时间。

当然,比较列表更有效。每项操作是一个比较,而不是哈希函数。据我所知,Python中有基于变量大小的整数,所以我的问题并不明显。比较一个整数与比较几个小得多的整数。如果您有整数的经典实现,例如在C或Java中,这一点很明显。如果您愿意,可以使用timeit进行测试。在我看来,使用任意精度的整数而不是本机整数将使哈希方法的速度相比之下更慢。我当然可以,但我想请你解释一下Python中的低级比较整数机制,以及它对我的问题的影响。我们谈论的是什么样的比较?平等?Python只会比较足够多的元素来确定两个列表是否不同,但如果列表基本相同,则必须进行大量比较。但你最好的办法是给你的实际情况计时。使用
timeit
模块,设计一些测试并测量。