我需要根据字符串两次不包含字符的标准来过滤字符串。
- 字符串很多(比如 1.4 万亿)。
- 字符串很短(大约 8 个字符)。
- 字符串是唯一的(缓存不起作用)。
- 字符串有一个大字符集(比如任何 Unicode 字符)。
- 字符串通常符合标准(比如 2/3 没有重复字符)。
使用代码如下所示:
>>> candidate_strings = ["foobnehg", "barfnehg", "bazfnehg"]
>>> result_strings = [s if unique_chars(s) for s in candidate_strings]
>>> print(result_strings)
["barfnehg", "bazfnehg"]
我实现了一个简单的版本,只是迭代字符串:
def unique_chars_naive(string_given):
"""
Checks if a given string contains only unique characters.
This version iterates the given string, saving all occurred characters.
"""
chars_seen = []
for char in string_given:
if char in chars_seen:
return False
chars_seen.append(char)
return True
我的下一个最佳想法是使用 a set
,所以我实现了:
def unique_chars_set(string_given):
"""
Checks if a given string contains only unique characters.
This version exploits that a set contains only unique entries.
"""
return len(string_given) == len(set(string_given))
将函数保存到文件UniqueCharacters.py
中,对它们进行计时:
$ python3 -m timeit -n 100000 --setup='import UniqueCharacters; candidate_strings = ["foobnehg", "barfnehg", "bazfnehg"]' '[UniqueCharacters.unique_chars_naive(s) for s in candidate_strings]'
100000 loops, best of 3: 20.3 usec per loop
$ python3 -m timeit -n 100000 --setup='import UniqueCharacters; candidate_strings = ["foobnehg", "barfnehg", "bazfnehg"]' '[UniqueCharacters.unique_chars_set(s) for s in candidate_strings]'
100000 loops, best of 3: 17.7 usec per loop
这表明unique_chars_set
该数据集的速度快了约 15%。
有没有更快的方法来做到这一点?也许用正则表达式?标准库中是否有一些方法可以做到这一点?