0

我正在寻找一种方法来有效地计算唯一数字与一个班轮。

例如:给定整数623562,返回值将是4

我目前的做法是,给定整数i,我使用len(set(str(i))). 创建一个集合非常耗时。我要处理很多数字,所以我需要一种有效的方法。

此外,如果有人可以找到一种方法来遍历所有带有数字的x数字而不使用 range()(并且在一个班轮中......),我会很高兴。使用时内存限制了我,range因为创建了一个列表(我假设)。

4

3 回答 3

11

sets 已针对此创作进行了优化。除非您想推出自己的十进制到字符串的转换(这需要不止一行),否则这是要走的路。

range仅在 Python 2.x 中分配内存。对于像 623562 这样的小数字,内存应该不是问题。对于更大的数字,请xrange在 Python 2.x 中使用,或者直接切换到 Python 3.x,其中range会及时生成数字。

于 2012-05-25T10:12:13.700 回答
2

我很难相信这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

那段时间的很大一部分只是生成随机数!如果你真的需要比这更快,我认为你应该考虑另一种语言。

于 2012-05-25T10:38:11.630 回答
1

这是一种避免每次都创建集合的方法。除了最后一行之外的所有代码都是初始化代码,所以只发生一次:

>>> 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 中让事情变得更复杂或试图变得过于聪明都会反过来影响你的性能。

于 2012-05-25T10:48:39.053 回答