我正在寻找一种方法来有效地计算唯一数字与一个班轮。
例如:给定整数623562
,返回值将是4
。
我目前的做法是,给定整数i
,我使用len(set(str(i)))
. 创建一个集合非常耗时。我要处理很多数字,所以我需要一种有效的方法。
此外,如果有人可以找到一种方法来遍历所有带有数字的x
数字而不使用
range()
(并且在一个班轮中......),我会很高兴。使用时内存限制了我,range
因为创建了一个列表(我假设)。
我正在寻找一种方法来有效地计算唯一数字与一个班轮。
例如:给定整数623562
,返回值将是4
。
我目前的做法是,给定整数i
,我使用len(set(str(i)))
. 创建一个集合非常耗时。我要处理很多数字,所以我需要一种有效的方法。
此外,如果有人可以找到一种方法来遍历所有带有数字的x
数字而不使用
range()
(并且在一个班轮中......),我会很高兴。使用时内存限制了我,range
因为创建了一个列表(我假设)。
set
s 已针对此创作进行了优化。除非您想推出自己的十进制到字符串的转换(这需要不止一行),否则这是要走的路。
range
仅在 Python 2.x 中分配内存。对于像 623562 这样的小数字,内存应该不是问题。对于更大的数字,请xrange
在 Python 2.x 中使用,或者直接切换到 Python 3.x,其中range
会及时生成数字。
我很难相信这len(set(str(num)))
对你来说还不够快。这是len(set(str()))
一个随机的非常大的数字 100,000 次的测试:
% python -m timeit -s 'import random' 'for i in range(100000): \
len(set(str(random.randint(199123212312399956789, 1000000099999999123091230000000))))'
10 loops, best of 3: 456 msec per loop
那段时间的很大一部分只是生成随机数!如果你真的需要比这更快,我认为你应该考虑另一种语言。
这是一种避免每次都创建集合的方法。除了最后一行之外的所有代码都是初始化代码,所以只发生一次:
>>> from operator import or_
>>> from collections import Counter
>>> from functools import reduce
>>> bits = {str(i):2**i for i in range(10)}
>>> counts = [Counter(format(i,'b'))['1'] for i in range(2**10)]
>>> counts[reduce(or_, (bits[c] for c in str(623562)))]
4
但是,它比简单、清晰、明显要慢 3 倍左右len(set(str(i)))
。像往常一样,在 Python 中让事情变得更复杂或试图变得过于聪明都会反过来影响你的性能。