哪些是pythonic?和Pythonic对速度

Kas*_*dig 6 python datetime timedelta

我是python的新手,只是写了这个模块级函数:

def _interval(patt):
    """ Converts a string pattern of the form '1y 42d 14h56m'
    to a timedelta object.
    y - years (365 days), M - months (30 days), w - weeks, d - days,
    h - hours, m - minutes, s - seconds"""

    m = _re.findall(r'([+-]?\d*(?:\.\d+)?)([yMwdhms])', patt)

    args = {'weeks': 0.0,
            'days': 0.0,
            'hours': 0.0,
            'minutes': 0.0,
            'seconds': 0.0}

    for (n,q) in m:
        if q=='y':
            args['days'] += float(n)*365
        elif q=='M':
            args['days'] += float(n)*30
        elif q=='w':
            args['weeks'] += float(n)
        elif q=='d':
            args['days'] += float(n)
        elif q=='h':
            args['hours'] += float(n)
        elif q=='m':
            args['minutes'] += float(n)
        elif q=='s':
            args['seconds'] += float(n)

    return _dt.timedelta(**args)
Run Code Online (Sandbox Code Playgroud)

我的问题是for这里的循环,即长if elif块,并想知道是否有更多的pythonic方式.
所以我重新编写了这个函数:

def _interval2(patt):

    m = _re.findall(r'([+-]?\d*(?:\.\d+)?)([yMwdhms])', patt)

    args = {'weeks': 0.0,
            'days': 0.0,
            'hours': 0.0,
            'minutes': 0.0,
            'seconds': 0.0}

    argsmap = {'y': ('days', lambda x: float(x)*365),
               'M': ('days', lambda x: float(x)*30),
               'w': ('weeks', lambda x: float(x)),
               'd': ('days', lambda x: float(x)),
               'h': ('hours', lambda x: float(x)),
               'm': ('minutes', lambda x: float(x)),
               's': ('seconds', lambda x: float(x))}

    for (n,q) in m:
        args[argsmap[q][0]] += argsmap[q][1](n)

    return _dt.timedelta(**args)
Run Code Online (Sandbox Code Playgroud)

我使用timeit模块测试了两个代码的执行时间,发现第二个代码花了大约5-6秒(对于默认的重复次数).

所以我的问题是:
1.哪个代码被认为更加pythonic?
2.写这个功能还有更多的pythonic吗?
3.如何在pythonicity和其他方面(如本例中的速度)编程之间进行权衡?

ps我有一个强大的代码OCD.

_interval2看到这个答案编辑:

argsmap = {'y': ('days', 365),
           'M': ('days', 30),
           'w': ('weeks', 1),
           'd': ('days', 1),
           'h': ('hours', 1),
           'm': ('minutes', 1),
           's': ('seconds', 1)}

for (n,q) in m:
    args[argsmap[q][0]] += float(n)*argsmap[q][1]
Run Code Online (Sandbox Code Playgroud)

uli*_*tko -1

就在这里。改用time.strptime

根据格式解析表示时间的字符串。返回值是orstruct_time返回的a 。gmtime()localtime()