Pythonic Code

目录

1、字符串拼接


×低效:每一步都需要建立新变量。

msg = 'line1\n'
msg += 'line2\n'
msg += 'line3\n'

高效:放进一个list,利用join连接

msg = ['line1', 'line2', 'line3']
'\n'.join(msg)

注意:避免使用+连接字符串
×低效:

# slow
msg = 'hello ' + my_var + ' world'

×低效:

# faster
msg = 'hello %s world' % my_var

高效:

# or better:
msg = 'hello {} world'.format(my_var)

2、条件判断

可读性+快
‘if variable:’ is faster than the un-idiomatic ‘if variable == True:’

×低效:

if variable == True:
    ...

高效:

if variable:
    ...

3、使用内置函数内置库——map代替for

内置函数利用C编译,都十分高效。
Guido’s Python Patterns - An Optimization Anecdote is a great read:

    If you feel the need for speed, go for built-in functions - you can't beat a loop written in C.
Check the library manual for a built-in function that does what you want. 

例1,将list中每个元素字符串大写

×低效(Example borrowed from this great wiki):

newlist = []
for word in oldlist:
    newlist.append(word.upper())

高效(Better):

newlist = map(str.upper, oldlist)  # wiki cites map as a for loop moved into C code

4、使用内置函数内置库——defaultdict(list)代替自定义和冗余附加判断

例2,将由元组组成的list进行dict,相同key的value放入同一list

×低效:

>>> d = {}
>>> s_keys = []
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> for k, v in s:
...      if k in s_keys:
...          temp_v = d[k]
...          temp_v.append(v)
...          d[k] = temp_v
...      else:
...          d[k]=v
...          s_keys.append(k)
>>> d
{'blue': [2, 4], 'red': [1], 'yellow': [1, 3]}

高效:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> for k, v in s:
...      d[k].append(v)
... 
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})

十分特别的例子:Python对MySQL中读取的数据进行多层字典嵌套json化

5、使用内置函数内置库——map(fun, dict(zip()))快速构建字典(用于表格展示的json)

>>> keys = ("id", "operator", "ts")
>>> result = ((1, "asco", "ts1"),
...     (2, "tonal", "ts2"),
...     (3, "celion", "ts3"),
...     (4, "conbul", "ts4"))

×低效:

# 好一些
>>> data = []
>>> for task in result:
...     data.append(dict(zip(keys, task)))
... 
>>> data
[{'operator': 'asco', 'id': 1, 'ts': 'ts1'}, {'operator': 'tonal', 'id': 2, 'ts': 'ts2'}, {'operator': 'celion', 'id': 3, 'ts': 'ts3'}, {'operator': 'conbul', 'id': 4, 'ts': 'ts4'}]

高效:

# 更快一些
>>> data2 = map(lambda x: dict(zip(keys, x)), result) 
>>> data2
[{'operator': 'asco', 'id': 1, 'ts': 'ts1'}, {'operator': 'tonal', 'id': 2, 'ts': 'ts2'}, {'operator': 'celion', 'id': 3, 'ts': 'ts3'}, {'operator': 'conbul', 'id': 4, 'ts': 'ts4'}]

6、循环内减少计算

如果您有一个大的迭代器,并且需要进行一些regex匹配,例如匹配一个日期:
×低效做法:

for i in big_it:
    m = re.search(r'\d{2}-\d{2}-\d{4}', i)
    if m:
        ...

最好编译一次regex并在循环中使用“缓存”版本:
高效:

date_regex = re.compile(r'\d{2}-\d{2}-\d{4}')

for i in big_it:
    m = date_regex.search(i)
    if m:
        ...

7、全局与局部变量

另一个技巧是将函数(计算)指定为局部变量:
"Python accesses local variables much more efficiently than global variables. "

myfunc = myObj.func
fcor i in range(n):
    myfunc(i) # faster than myObj.func(i)

在缓存方面,对于memoization(一种优化技术,主要用于存储昂贵函数调用的结果并在再次发生相同输入时返回缓存的结果,从而加快计算机程序的速度),您可以使用functools.lru缓存装饰器。lru=最近使用最少,一个好的用例是从Web获取数据(docs页面有一个静态Web内容的lru缓存示例)。python – 为什么程序在放入函数时要快得多?

8、特殊函数exec、dir


在这里插入图片描述
原始数据来自数据库[(),(),(),…],需数据提取,
一部分按os计算天级别量total;
一部分按os、field、detail计算天级别hit。
可以最终的数据转为DF进行连接,然而这里并没有,直接利用

exec('='.join('ANDROID', str(total_android)))
exec('='.join('IOS', str(total_ios)))

最终的结果是[[date, os, field, detail, …], [], [], …],将其写入MySQL库,遍历找到对应的数据将其追加到对应的list。

for i in result:
    if i[1] == 'android' and "ANDROID" in dir():
        加Android的总量total追加到i中
    elif:
        ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值