gpt4 book ai didi

python - 执行字符串查找的最快方法?

转载 作者:太空狗 更新时间:2023-10-29 21:10:34 44 4
gpt4 key购买 nike

假设我们有一定数量的可能字符串:

possible_strings_list = ['foo', 'bar', 'baz', 'qux', 'spam', 'ham', 'eggs'] 

并接收已知是其中之一的新字符串。我们想为每个新字符串分配一个整数,例如

if new_string == 'foo':
return 0
elif new_string == 'bar':
return 1
...

在 Python 3.6 中最快的方法是什么?我尝试了几种方法,目前为止使用字典是最快的:

list_index 2.7494255019701086
dictionary 0.9412809460191056
if_elif_else 2.10705983400112
lambda_function 2.6321219780365936
tupple_index 2.751029207953252
ternary 1.931659944995772
np_where 15.610908019007184

然而,我或多或少是一个 Python 新手,如果有其他更快的解决方案,我很感兴趣。你有什么建议吗?

我的完整测试代码:

import timeit
import random
import numpy as np

def list_index(i):
return(possible_strings_list.index(i))

def dictionary(i):
return possible_strings_dict[i]

def tupple_index(i):
return possible_strings_tup.index(i)


def if_elif_else(i):
if i == 'foo':
return 1
elif i == 'bar':
return 2
elif i == 'baz':
return 3
elif i == 'qux':
return 4
elif i == 'spam':
return 5
elif i == 'ham':
return 6
elif i == 'eggs':
return 7

def ternary(i):
return 0 if i == 'foo' else 1 if i == 'baz' else 2 if i == 'bar' else 3 if i == 'qux' else 4 if i == 'spam'else 5 if i == 'ham' else 6

n = lambda i: 0 if i == 'foo' else 1 if i == 'baz' else 2 if i == 'bar' else 3 if i == 'qux' else 4 if i == 'spam'else 5 if i == 'ham' else 6
def lambda_function(i):
return n(i)

def np_where(i):
return np.where(possible_strings_array == i)[0][0]

##
def check(function):
for i in testlist:
function(i)

possible_strings_list = ['foo', 'bar', 'baz', 'qux', 'spam', 'ham', 'eggs']
testlist = [random.choice(possible_strings_list) for i in range(1000)]
possible_strings_dict = {'foo':0, 'bar':1, 'baz':2, 'qux':3, 'spam':4, 'ham':5, 'eggs':6}
possible_strings_tup = ('foo', 'bar', 'baz', 'qux', 'spam', 'ham', 'eggs')
allfunctions = [list_index, dictionary, if_elif_else, lambda_function, tupple_index, ternary, np_where]

for function in allfunctions:
t = timeit.Timer(lambda: check(function))
print(function.__name__, t.timeit(number=10000))

最佳答案

字典查找是执行此搜索的最快方法。在进行这样的分析时,您通常会比较 Time Complexity每个过程。

对于字典查找,时间复杂度是“常数时间”,即O(1)。虽然这可能意味着它通常是算法可以采取的步骤的整数值,但在这种情况下它实际上是一个。

其他方法将需要迭代(或者在 if elses 遍历的情况下——这本质上是一种类似的方法)。这些范围从需要查看所有值 O(n) 到需要查看某些值 O(log n)。

由于 n 是检查集的大小,并且随着集变大,结果的方差也会增加,字典的性能始终优于显示的其他选项。

没有比 O(1) 更快的方法。您所展示的方法的唯一缺点是,随着集合的增长,它可能需要更多的内存,这被称为算法的空间复杂性。但在这种情况下,由于集合中的每个项目我们只需要一个值,空间复杂度将为 O(n),可以忽略不计。

在优化的一般意义上,重要的是要考虑当前解决方案中存在多少复杂性,以及改进该复杂性有多大意义。如果要进行改进,它们的目标应该是达到不同的性能等级,例如从 O(n) 到 O(log n) 或 O(log n) 到 O(1)。

Time Complexity Comparisons
图片提供:http://bigocheatsheet.com/

微优化往往是针对同一复杂层进行优化的情况,而这些优化本身通常没有建设性。

关于python - 执行字符串查找的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48817141/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com