我怎样才能提高算法的速度,哪怕是最微小的提高

2024-04-19 03:04:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我怎样才能提高我的算法的速度,哪怕是一点点。 因为我这样做的原因,我实际上一点也不关心速度,但我想知道如果我这样做了,我能改变什么。我想知道的不仅仅是指出需要改变的具体事情,我真正想知道的是,你是如何知道有一种更有效的方法,以及这种方法是如何工作的。基本上,如果您想了解低级代码是如何工作的,以便能够在更高的级别编写更好的代码,那么应该遵循什么样的思路

def decode_all(ob):
    if(type(ob)==list):
        for i in range(len(ob)):
            ob[i] = decode_all(ob[i])
    if(type(ob)==dict):
        for i in ob.copy():
            ob[i] = decode_all(ob[i])
            if(type(i)==bytes):
                ob[i.decode()] = ob[i]
                ob.pop(i)
    if(type(ob)==tuple):
        new_ob = []
        for i in ob:
            new_ob.append(decode_all(i))
        ob = tuple(new_ob)
    if(type(ob)==bytes):
        return ob.decode()
    return ob

Tags: 方法代码in算法newforreturnif
1条回答
网友
1楼 · 发布于 2024-04-19 03:04:06

修改代码:

def decode_all(ob):
    if isinstance(ob, list):
        return [decode_all(e) for e in ob]
    if isinstance(ob, dict):
        return {decode_all(k): decode_all(v) for k, v in ob.items()}
    if isinstance(ob, tuple):
        return tuple([decode_all(e) for e in ob])
    if isinstance(ob, bytes):
        return ob.decode()
    return ob

通常,我同意使用if ... elif ... elif ...,但在这种情况下,直接返回结果更简单

一些注意事项:

  1. 无副作用ob或其任何成分(无论深度)均未被修改;所有新集合和元素都将返回,但它们的分配会产生一些(轻微的)性能代价
  2. 使用isinstance(),而不是if type(x) == y(这只是一个好习惯,在这里对基类型没有特别的优势)
  3. 使用列表和听写理解;简单得多,不怕改变原作,本质上是Python式的
  4. 不需要处理dict键是字节的情况:改用您自己的函数
  5. tuple([x for x in list_])比{}稍微快一点,我最近了解到

一些备选方案:

  1. 如果您更喜欢if ... elif ...
def decode_all(ob):
    if isinstance(ob, list):
        ob = [decode_all(e) for e in ob]
    elif isinstance(ob, dict):
        ob = {decode_all(k): decode_all(v) for k, v in ob.items()}
    elif isinstance(ob, tuple):
        ob = tuple(decode_all(e) for e in ob)
    elif isinstance(ob, bytes):
        ob = ob.decode()
    return ob
  1. 最快(但有点不透明):
def _fun_bytes(ob):
    return ob.decode()

def _fun_list(ob):
    return [decode_all(e) for e in ob]

def _fun_dict(ob):
    return {decode_all(k): decode_all(v) for k, v in ob.items()}

def _fun_tuple(ob):
    return tuple([decode_all(e) for e in ob])

def _identity(ob):
    return ob

fun_dict = {
    bytes: _fun_bytes,
    list: _fun_list,
    dict: _fun_dict,
    tuple: _fun_tuple,
}

def decode_all(ob):
    return fun_dict.get(type(ob), _identity)(ob)
  1. 最具可扩展性(您可以在代码库的各个区域添加各种.register,例如处理新类型):
from functools import singledispatch

@singledispatch
def decode_all(ob):
    return ob

@decode_all.register
def _(ob: bytes):
    return ob.decode()

@decode_all.register
def _(ob: list):
    return [decode_all(e) for e in ob]

@decode_all.register
def _(ob: dict):
    return {decode_all(k): decode_all(v) for k, v in ob.items()}

@decode_all.register
def _(ob: tuple):
    return tuple([decode_all(e) for e in ob])

相关问题 更多 >