Python遍历列表并修改元素的值

怎样Python遍历列表并修改元素的值?
Python是一门灵活的语言,这个问题,不同人的习惯写法可能不同。
但有时不同的写法效率可以相差两万倍,甚至更多,这点需要时刻警惕。


以修改一个比较大的列表(元素个数8万多个)里面元素的值为例,比较两种写法的效率。

import json
import pickle
from time import perf_counter as pc

path = 'subjects.json'

# 写法1
records = [json.loads(line) for line in open(path)]
print(len(records))
t1 = pc()
for rec in records:
i = records.index(rec)
if type(rec['year']) == list:
records[i]['year'] = 1900

time1 = pc() - t1
print(time1)

# 写法2
records = [json.loads(line) for line in open(path)]
print(len(records))
t2 = pc()
for i, v in enumerate(records):
if type(v['year']) == list:
records[i]['year'] = 1900
time2 = pc() - t2
print(time2)

print(time1 // time2)

代码在Python3.5.2下运行,在我的机器上运行结果如下:

82040
1309.4687260760693
82040
0.06331566709559411
20681.0

二者相差2万多倍,这是天壤之别!

平时编程两种写法我都有写过,但并没有考虑效率问题,想当然地以为效率应该差不多,可能之前遍历的列表都是很小的,没能觉察到区别。在较大的数据面前便暴露无遗。实际上第一种是又丑又低效而且CPU占用极高,第二种是简洁又高效的写法。

体会:

在没把代码写对之前,千万别抱怨Python运行效率怎么这么慢,很可能是代码没写对、没了解这门语言。其它语言也同样如此。只有高手才有资格说哪个语言慢,哪个快,当然也会有使用场景的不同。PS,估计真正的高手们不会去随便评论一门语言。

开发中优先考虑编码速率而不是代码运行效率,这个思路并没错,人比CPU贵多了,也符合Python的特点,本就是为了简洁快速地编码而诞生。但这并不是能作为能想当然和懒惰的理由,要写出好代码,必须要有追求简洁又高效的心,多思考、多对比、多实践,才能进步。否则就是不思进取,是不实践的想当然,不可能成为优秀的coder。