Python程序运行太慢的一个可能的原因是没有尽可能的调用内置方法,下面通过5个例子来演示如何用内置方法提升PythGon程序的性能。1. 数组求平方和输入一个列表,要求计算出该列表中数字的的平方和。最终性能提升了1.4倍。首先创建一个长度为10000的列表。arr = list(range(10000))1.1 最常规的写法while循环遍历列表求平方和。平均运行时间2.97毫秒。def sum_sqr_0(arr):

res = 0

n = len(arr)

i = 0

while i

res += arr[i] ** 2

i += 1

return res

%timeit sum_sqr_0(arr)

2.97 ms ± 36.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

1.2 for range代替while循环

避免i += 1的变量类型检查带来的额外开销。平均运行时间2.9毫秒。def sum_sqr_1(arr):

res = 0

for i in range(len(arr)):

res += arr[i] ** 2

return res

%timeit sum_sqr_1(arr)

2.9 ms ± 137 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

1.3for x in arr代替for range

避免arr[i]的变量类型检查带来的额外开销。平均运行时间2.59毫秒。def sum_sqr_2(arr):

res = 0

for x in arr:

res += x ** 2

return res

%timeit sum_sqr_2(arr)

2.59 ms ± 89 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

1.4 sum函数套用map函数

平均运行时间2.36毫秒def sum_sqr_3(arr):

return sum(map(lambda x: x**2, arr))

%timeit sum_sqr_3(arr)

2.36 ms ± 15.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

1.5 sum函数套用生成器表达式

生成器表达式如果作为某个函数的参数,则可以省略掉()。平均运行时间2.35毫秒。def sum_sqr_4(arr):

return sum(x ** 2 for x in arr)

%timeit sum_sqr_4(arr)

2.35 ms ± 107 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

1. 6 sum函数套用列表推导式

平均运行时间2.06毫秒。def sum_sqr_5(arr):

return sum([x ** 2 for x in arr])

%timeit sum_sqr_5(arr)

2.06 ms ± 27.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

2. 字符串拼接

输入一个列表,要求将列表中的字符串的前3个字符都拼接为一个字符串。最终性能提升了2.1倍。

首先创建一个列表,生成10000个随机长度和内容的字符串。from random import randint

def random_letter():

return chr(ord('a') + randint(0, 25))

def random_letters(n):

return "".join([random_letter() for _ in range(n)])

strings = [random_letters(randint(1, 10)) for _ in range(10000)]

2.1 最常规的写法

while循环遍历列表,对字符串进行拼接。平均运行时间1.86毫秒。def concat_strings_0(strings):

res = ""

n = len(strings)

i = 0

while i

res += strings[i][:3]

i += 1

return res

%timeit concat_strings_0(strings)

1.86 ms ± 74.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

2.2for range代替while循环

避免i += 1的变量类型检查带来的额外开销。平均运行时间1.55毫秒。def concat_strings_1(strings):

res = ""

for i in range(len(strings)):

res += strings[i][:3]

return res

%timeit concat_strings_1(strings)

1.55 ms ± 32.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

2.3for x in strings代替for range

避免strings[i]的变量类型检查带来的额外开销。平均运行时间1.32毫秒。def concat_strings_2(strings):

res = ""

for x in strings:

res += x[:3]

return res

%timeit concat_strings_2(strings)

1.32 ms ± 19.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

2.4 .join方法套用生成器表达式

平均运行时间1.06毫秒。def concat_strings_3(strings):

return "".join(x[:3] for x in strings)

%timeit concat_strings_3(strings)

1.06 ms ± 15.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

2.5 .join方法套用列表解析式

平均运行时间0.85毫秒。def concat_strings_4(strings):

return "".join([x[:3] for x in strings])

%timeit concat_strings_4(strings)

858 µs ± 14.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3. 筛选奇数

输入一个列表,要求筛选出该列表中的所有奇数。最终性能提升了3.6倍。

首先创建一个长度为10000的列表。arr = list(range(10000))

3.1 最常规的写法

创建一个空列表res,while循环遍历列表,将奇数append到res中。平均运行时间1.03毫秒。def filter_odd_0(arr):

res = []

i = 0

n = len(arr)

while i

if arr[i] % 2:

res.append(arr[i])

i += 1

return res

%timeit filter_odd_0(arr)

1.03 ms ± 34.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3.2for range代替while循环

避免i += 1的变量类型检查带来的额外开销。平均运行时间0.965毫秒。def filter_odd_1(arr):

res = []

for i in range(len(arr)):

if arr[i] % 2:

res.append(arr[i])

i += 1

return res

%timeit filter_odd_1(arr)

965 µs ± 4.02 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3.3for x in arr代替for range

避免arr[i]的变量类型检查带来的额外开销。平均运行时间0.430毫秒。def filter_odd_2(arr):

res = []

for x in arr:

if x % 2:

res.append(x)

return res

%timeit filter_odd_2(arr)

430 µs ± 9.25 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3.4 list套用filter函数

平均运行时间0.763毫秒。注意filter函数很慢,在Python 3.6里非常鸡肋。def filter_odd_3(arr):

return list(filter(lambda x: x % 2, arr))

%timeit filter_odd_3(arr)

763 µs ± 15.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3.5 list套用生成器表达式

平均运行时间0.398毫秒。def filter_odd_4(arr):

return list((x for x in arr if x % 2))

%timeit filter_odd_4(arr)

398 µs ± 16.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

3.6 带条件的列表推导式

平均运行时间0.290毫秒。def filter_odd_5(arr):

return [x for x in arr if x % 2]

%timeit filter_odd_5(arr)

290 µs ± 5.54 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

4. 两个数组相加

输入两个长度相同的列表,要求计算出两个列表对应位置的数字之和,返回一个与输入长度相同的列表。最终性能提升了2.7倍。

首先生成两个长度为10000的列表。arr1 = list(range(10000))

arr2 = list(range(10000))

4.1 最常规的写法

创建一个空列表res,while循环遍历列表,将两个列表对应的元素之和append到res中。平均运行时间1.23毫秒。def arr_sum_0(arr1, arr2):

i = 0

n = len(arr1)

res = []

while i

res.append(arr1[i] + arr2[i])

i += 1

return res

%timeit arr_sum_0(arr1, arr2)

1.23 ms ± 3.77 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

4.2for range代替while循环

避免i += 1的变量类型检查带来的额外开销。平均运行时间0.997毫秒。def arr_sum_1(arr1, arr2):

res = []

for i in range(len(arr1)):

res.append(arr1[i] + arr2[i])

return res

%timeit arr_sum_1(arr1, arr2)

997 µs ± 7.42 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

4.3for i, x in enumerate代替for range

部分避免arr[i]的变量类型检查带来的额外开销。平均运行时间0.799毫秒。def arr_sum_2(arr1, arr2):

res = arr1.copy()

for i, x in enumerate(arr2):

res[i] += x

return res

%timeit arr_sum_2(arr1, arr2)

799 µs ± 16.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

4.4for x, y in zip代替for range

避免arr[i]的变量类型检查带来的额外开销。平均运行时间0.769毫秒。def arr_sum_3(arr1, arr2):

res = []

for x, y in zip(arr1, arr2):

res.append(x + y)

return res

%timeit arr_sum_3(arr1, arr2)

769 µs ± 12.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

4.5 列表推导式套用zip

平均运行时间0.462毫秒。def arr_sum_4(arr1, arr2):

return [x + y for x, y in zip(arr1, arr2)]

%timeit arr_sum_4(arr1, arr2)

462 µs ± 3.43 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

5. 两个列表相同元素的数量

输入两个列表,要求统计两个列表相同元素的数量。其中每个列表内的元素都是不重复的。最终性能提升了5000倍。

首先创建两个列表,并将元素的顺序打乱。from random import shuffle

arr1 = list(range(2000))

shuffle(arr1)

arr2 = list(range(1000, 3000))

shuffle(arr2)

5.1 最常规的写法

while循环嵌套,判断元素arr1[i]是否等于arr2[j],平均运行时间338毫秒。def n_common_0(arr1, arr2):

res = 0

i = 0

m = len(arr1)

n = len(arr2)

while i

j = 0

while j

if arr1[i] == arr2[j]:

res += 1

j += 1

i += 1

return res

%timeit n_common_0(arr1, arr2)

338 ms ± 7.81 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

5.2for range代替while循环

避免i += 1的变量类型检查带来的额外开销。平均运行时间233毫秒。def n_common_1(arr1, arr2):

res = 0

for i in range(len(arr1)):

for j in range(len(arr2)):

if arr1[i] == arr2[j]:

res += 1

return res

%timeit n_common_1(arr1, arr2)

233 ms ± 10.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

5.3for x in arr代替for range

避免arr[i]的变量类型检查带来的额外开销。平均运行时间84.8毫秒。def n_common_2(arr1, arr2):

res = 0

for x in arr1:

for y in arr2:

if x == y:

res += 1

return res

%timeit n_common_2(arr1, arr2)

84.8 ms ± 1.38 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

5.4 使用if x in arr2代替内层循环

平均运行时间24.9毫秒。def n_common_3(arr1, arr2):

res = 0

for x in arr1:

if x in arr2:

res += 1

return res

%timeit n_common_3(arr1, arr2)

24.9 ms ± 1.39 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

5.4 使用更快的算法

将数组用.sort方法排序,再进行单层循环遍历。把时间复杂度从O(n2)降低到O(nlogn),平均运行时间0.239毫秒。def n_common_4(arr1, arr2):

arr1.sort()

arr2.sort()

res = i = j = 0

m, n = len(arr1), len(arr2)

while i

if arr1[i] == arr2[j]:

res += 1

i += 1

j += 1

elif arr1[i] > arr2[j]:

j += 1

else:

i += 1

return res

%timeit n_common_4(arr1, arr2)

329 µs ± 12.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

5.5 使用更好的数据结构

将数组转为集合,求交集的长度。平均运行时间0.067毫秒。def n_common_5(arr1, arr2):

return len(set(arr1) & set(arr2))

%timeit n_common_5(arr1, arr2)

67.2 µs ± 755 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

python 4.5%2_程序运行慢?你怕是写的假 Python相关推荐

  1. 程序运行慢?你怕是写的假 Python

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:机器学习算法那些事 Python程序运行太慢的一个可能的 ...

  2. python写算法太慢_程序运行慢?你怕是写的假 Python

    Python程序运行太慢的一个可能的原因是没有尽可能的调用内置方法,下面通过5个例子来演示如何用内置方法提升Python程序的性能. 1. 数组求平方和 输入一个列表,要求计算出该列表中数字的的平方和 ...

  3. python使用tqdm实现程序运行进度条

    python使用tqdm实现程序进度条 tqdm源自阿拉伯语单词taqaddum( ) 意思是"进步",是西班牙语中"我非常爱你"的缩写. tqdm deriv ...

  4. python显示运行时间_python程序运行进程、使用时间、剩余时间显示功能的实现代码...

    有很多程序运行时间比较长,如果不将运行过程输出将很难判断程序运行的时间.下边这段程序将按照上图所示的格式输出程序运行进程.已用时间.剩余时间. def time_change(time_init): ...

  5. 不是程序员学python有什么用-程序员的基本功:为什么非要用Python,其他语言不好吗?...

    原标题:程序员的基本功:为什么非要用Python,其他语言不好吗? Python能够这么火其中一个重要的原因是数据分析带起来的.Python的优点有很多,同样一个功能,其他语言需要写100行,而Pyt ...

  6. python爬取b站评论_学习笔记(1):写了个python爬取B站视频评论的程序

    学习笔记(1):写了个python爬取B站视频评论的程序 import requests import json import os table='fZodR9XQDSUm21yCkr6zBqiveY ...

  7. python实现录音小程序 界面_python怎么对矩阵添加一列python实现录音小程序

    本文为大家分享了python实现录音小程序的具体代码,供大家参考,具体内容如下 学习目标: 学习电脑网从python实现录音小程序分析来看,对python实现录音小程序的结果.掌握python的pya ...

  8. python运行非常慢的解决-python 处理大数据程序运行的越来越慢的问题

    最近编写并运行了一个处理1500万个数据的程序,本来最初每秒可以处理150个左右的数据,预计大概15个小时的时间就可以处理完,晚上的时候就开始运行,本以为等到第二天中午就可以得到结果呢,,, 可是,等 ...

  9. python3程序运行中会跳过注释行_[python] 去除代码源文件中单行注释

    """ 利用正则表达式去除文件中的单行注释,支持多行稍加更改即可 """ import os import re pattern_c = { ...

最新文章

  1. html和css学习,HTML与CSS学习小结
  2. 网络知识:说说我们常听说的网络攻击是怎么回事?
  3. centos搭建rsync服务!
  4. 对Linux网络配置管理的简单使用经验
  5. 微信小程序 - 关于下拉刷新
  6. hdu 1423(LCS+LIS)
  7. nvidia控制面板只有3d设置?
  8. ember controller内调用save修改model数据时出现null的解决方案
  9. vlan间路由+静态路由+NAT(PAT+静态NAT)综合实验
  10. android AndroidManifest.xml 属性详细解析
  11. 2012工行软开中心-广州面试
  12. Gartner发布2021年新兴技术成熟度曲线,三大新兴技术趋势主题
  13. Log4j2官方文档翻译--欢迎使用Log4j2!
  14. bios计算机专业术语全称,bios是什么意思 电脑进入bios方法【图文】
  15. ImportError: cannot import name ‘get_all_providers‘ from ‘onnxruntime.capi._pybind_state‘
  16. SQLmap在进行SQL注入时的整个流程
  17. 给视频加字幕HTML代码,给Html5视频播放器添加字幕
  18. gensim LDA模型提取每篇文档所属主题(概率最大主题所在)
  19. 【基础算法】最大公约数(Acwing872题)(辗转相除法)
  20. Linux Ubuntu

热门文章

  1. 初探Vue之环境搭建
  2. 单文档程序创建的时候,标题栏的无标题怎么可以去掉,并且改成自己想要的字符...
  3. tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
  4. linux将b1内容重定向到b3,linux
  5. StringUtils中 isNotEmpty 和isNotBlank的区别
  6. nodejs在cmd中运行js_如何在nodejs里调用执行系统命令
  7. 焊接工具DIY电焊机,自动触发笔,手持电焊笔
  8. Apriltag可用图片:TAG16H5
  9. 基于RT-Thread开发智能视觉组智能车 - 温州大学 - 春华秋实
  10. 第十六届智能汽车竞赛AI视觉组分赛区数据集发布