在我的案例中,替换switch语句的最有效方法是什么?

时间:2015-12-07 13:43:19

标签: python performance list switch-statement runtime

我需要在biglist中搜索和排序大量数据,并将它们放在python 3.5中的其他列表中。 当我完成编码时,我意识到如果我只需要检查biglist中的项目,我应该使用switch语句来提高代码的效率。我初学者讲的是python。我在python 3.5中搜索了switch语句,并且很震惊,这样的声明并没有。存在于python中。(我在C,Java和JavaScript中编写了一些程序,它们都有switch语句,所以我认为在每种语言中都必须存在流控制。)

我搜索biglist的代码部分看起来像这样:

for item in biglist:
    if item == String1:
        list1.append(biglist[biglist.index(item) + 1])
        continue
   # 
   #this goes on till String10 and ends like this
   # 
    elif item == String10:
        list10.append(biglist[biglist.index(item) + 1])
        continue
    else:
        break

整个程序花了大约12个小时来完成一个数据集。我需要这样做4次,但在我这样做之前,如果我还没有实现最有效的解决方案,我会喜欢一些建议,甚至是如何使我的代码更高效,更快速的解决方案。

请解释为什么解决方案更有效率,因为我想了解它。

3 个答案:

答案 0 :(得分:2)

效率低与"切换"的存在或其他无关,但事实上您使用.index()方法,该方法会在列表中进行全面扫描以找到您的项目。没有必要这样做,您可以使用enumerate函数返回索引:

for index, item in enumerate(biglist):
    if item == String1:
        list1.append(biglist[index + 1])

答案 1 :(得分:1)

性能问题很可能不是类似switch的if语句,而是在O(n)(Complexity of list.index(x) in Python)中运行的biglist.index(item)操作。

使用类似:

for idx, item in enumerate(biglist):
    print idx, item 

跟踪项目的索引。

如果你仍然想要替换if语句,你可以使用一个字典,其中列出了为每个可能的项目值存储的列表。

答案 2 :(得分:1)

这可以模仿switch

def switch(x):
    return {
            'String1': list1,
            'String10' : list10
           }.get(x)

for item in bigList:
    try:
        switch(item).append(biglist[biglist.index(item) + 1])
    except AttributeError:
        #Do some other work