平时在使用Python编程的过程中,发现很多小技巧,但是对执行时间、占用内存影响非常大,特此在这里总结一下,有新的就会更新,先把遇到的记录在这里。
1.列表list的in操作是经常用到的,也就是判断某个元素是否存在于某个list中,时间复杂度为O(n),n为list中元素的个数
而set的判断in操作时间复杂度为O(1),这样我们以后在判断某个元素是否存在于list,尤其当这个in操作需要执行多次时,将list转换为set判断,程序会快个O(m)级别,m表示in 的操作次数
比如我们对如下两个代码打印花费的时间结果如下:
wordList=list(range(10**6))
start = time.clock()
"xyz" in wordList
print("Time used:",time.clock() - start)
Time used: 0.014611221267841756
wordList=list(range(10**6))
"xyz" in set(wordList)
start = time.clock()
print("Time used:",time.clock() - start)
Time used: 6.46008993498981e-05
可见时间级别相差10^3级别
总结一下python中list、set和dict数据类型各个操作的时间复杂度:
list的get、set、append、GetLength操作的时间复杂度为O(1),其他一般为O(n),比如常见的insert、copy、delete、extend、min、max等为O(n)
set的in判断操作为O(n)
dict的in、get、set、delete为O(1),copy为O(n)
参考链接:
三种数据类型各种操作时间复杂度表格比较:
https://blog.csdn.net/acbattle/article/details/97012800
dict和list的in操作时间复杂度比较:
https://blog.csdn.net/wqtltm/article/details/83149070
2. yield生成迭代器代替list,防止占用内存过多
原因为迭代器会一个一个加载,但是list会一次性加载进来
参考链接:
https://www.runoob.com/w3cnote/python-yield-used-analysis.html
3. pandas里面使用stack将一列变成多列:
比如我的数据是这样的:
数据中fir_insec里面一个数字对应sec_insec里面的好几个数字,我想增加若干列,将这两列的数字变成一一对应的关系,使用如下操作:
graph_df_temp = (graph_df.set_index(['fir_insec'])['second_insec_str']
.str.split(' ', expand=True)
.stack()
.reset_index(level=1, drop=True)
.reset_index(name='second_insec_str'))
最终的结果如下:
参考链接:后面补上
未完待更新