python编码效率高吗_【原创】杠精的日常-讨论python快排的效率
事情的起因是我的一个回答:
里面的大佬提供了一个快排算法
def 快排(a):
return a and 快排([i for i in a if ia[0]])
一行代码写的十分优雅。
于是我写了如下代码进行对比
import time
import numpy as np
from random import random
from astartool.number import equals_zero_all
npa = np.array
def qsort1(a: list):
"""
知乎网友 划船協會 主页地址 https://www.zhihu.com/people/hua-chuan-xie-hui/activities
提供思路,感谢分享
:param a:
:return:
"""
return a and qsort1([i for i in a if i < a[0]]) + [i for i in a if i == a[0]] + qsort1([i for i in a if i > a[0]])
def qsort2(a: list):
"""
我的代码--快排
利用栈实现的快速排序(非递归算法)
:param a:
:return:
"""
stack = [(0, len(a) - 1)]
while stack:
ind, end = stack.pop()
i, j = ind, end
key = a[ind]
while i < j:
while j > i and key <= a[j]:
j -= 1
if j <= i:
break
a[i], a[j] = a[j], a[i]
i += 1
while j > i and key >= a[i]:
i += 1
if j <= i:
break
a[i], a[j] = a[j], a[i]
j -= 1
if ind < i - 1:
stack.append((ind, i - 1))
if i + 1 < end:
stack.append((i + 1, end))
return a
def equals(a, b):
"""
判断a和b是否相等
:param a:
:param b:
:return:
"""
return equals_zero_all(npa(a)-npa(b), 1e-12)
def my_test(l: int):
"""
测试函数
:param l: 数据规模
:return: 知乎网友划船協會提供在代码时间, 我自己写在代码在时间, list.sort时间, sorted的时间
"""
a = [random() for _ in range(l)]
b = a.copy()
c = a.copy()
d = a.copy()
e = a.copy()
# print(a)
t1 = time.clock()
sb = qsort1(b)
t2 = time.clock()
sc = qsort2(c)
t3 = time.clock()
d.sort()
t4 = time.clock()
se = sorted(e)
t5 = time.clock()
# print(t2 - t1, sb)
# print(t3 - t2, sc)
assert equals(sb, sc)
assert equals(sb, d)
assert equals(sb, se)
return t2 - t1, t3 - t2, t4 - t3, t5 - t4
x = [100, 500, 1000, 10000, 100000, 1000000]
for l in x:
t = my_test(l)
print(t)
运行结果为
(0.0020383999999999958, 0.0013799859999998887, 0.00014368300000011658, 0.0001452620000002014)
(0.021408730000000098, 0.0213862309999997, 0.0001646029999999854, 0.0001693410000003226)
(0.017994686000000204, 0.011673828999999802, 0.000404205999999796, 0.0004993370000003772)
(0.19425908400000003, 0.14128751600000022, 0.005214815999999622, 0.004091406000000131)
(2.6890752549999997, 1.9520561440000002, 0.07384543600000004, 0.08302494800000026)
(36.369763621999994, 22.788260172, 1.0100625289999954, 0.9511514160000019)
以上元祖每组分别是随机100、500、1000、10000、100000、1000000个随机数进行排序所需要的时间。
每个元祖分别代表 知乎网友划船協會提供在代码(以后简写成代码1)时间, 我自己写在代码(以后简写成代码2)在时间, list.sort(以后简称成代码3)时间, sorted(以后简写成代码4)的时间
看起来, 虽然代码1简练优雅,但是实际上缺乏执行效率。代码2代码虽然冗长,但是执行效率稍微高一点。系统函数代码3和代码4效率相差不明显,但是明显优于代码1和代码2。
那么为什么代码1会稍微慢一些呢?
我认为主要在以下的方面代码1在递归的过程中不断生成新的列表,递归耗时和列表生成存在耗时(不仅耗时,而且耗空间)
代码每一趟的计算上,代码2扫1遍列表得到的两部分。而代码1是扫了3遍表并且把表分成了3部分。又因为随机数的原因,导致代码1中的第二部分元素等于a[0]的列表元素个数基本上会等于1。三部分的列表还是相当于把元素分成两部分。
不过呢,比较之后,也给了我们一些启示尽量使用自带的工具。能不造轮子就不造轮子。(自己手撸执行效率又低,还浪费时间)
简练的东西执行效率不一定高。
不过嘛,个人喜好而言,虽然执行效率不高,我还是更加喜欢代码1,符合简单即美的python哲学。关键问题还是--这种写法实在太秀了。
python编码效率高吗_【原创】杠精的日常-讨论python快排的效率相关推荐
- python go高并发_天下武功为快不破,戏说Python与Go高并发争锋!
在这个以斗气大陆横行的世界,每一个大的势力宗门都有自己的杀手锏的功法,比如老牌的古族有C++这样的巨无霸语言,药族有C语言,几乎斗气大陆所有的操作系统都是用C语言做的,毕竟斗气都要靠吃丹药维持.而实力 ...
- python为什么是蛇_【大蟒蛇】简谈Python的闭包【原创】
我们知道在Python中一切皆对象,包括函数也是一样,函数名可以赋值给一个变量,也可以当作一个参数传递给另外一个函数的形参,当然也可以将函数名作为另外一个函数的返回值使用,总之函数的使用可以非常的灵活 ...
- python 进程生命周期_计算客户生命周期价值的python解决方案
python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...
- python国内书籍推荐_久等了,你要的 Python 书籍推荐,来了!
前言 时不时有小伙伴私信问我有什么好一些的 Python 书籍推荐,想要学习学习. 那么今天就来给大伙说道说道,我会划分为以下几个分类,让不同阶段的朋友可以根据自身的情况,选择适合自己当下学习的 Py ...
- python批量命名教程_《自拍教程69》Python 批量重命名音频文件,AV专家必备!
本篇主要学习如何Python自定义模块并调用该模块,并重点介绍Python正则表达式的强大的文本处理能力. 案例故事:任何一款终端产品只要涉及音频输出,就肯定涉及音频的解码, 作为一名专业的AV (A ...
- python查看数据大小_科多大数据带你看Python可以列为最值得学习的编程语言
原标题:科多大数据带你看Python可以列为最值得学习的编程语言 不知道从什么时候开始,这句话开始流行.不过也从侧面反映出 Python 语言的特点:简单.高效. 从近期代表技术趋势的业界报告以及编程 ...
- python基本词汇的特点_开课吧老师为你讲解 Python都有什么优点?
前两天刷微博的时候看到了一篇非常励志的新闻,给大家分享一下.最近北京大学举办了一场"争做数一数二的保安员"评选会,20名来自各岗位的保安员进行了现场汇报.其中,保安小哥许文龙考上本 ...
- python积木编程软件_童心制物慧编程全新 Python 编辑器正式上线
原标题:童心制物慧编程全新 Python 编辑器正式上线 作为一款致力于 提供更专业.更多样的STEAM教育解决方案的编程软件,童心制物慧编程一直不断在优化慧编程的教学功能,只为了给所有编程教育者提供 ...
- 吃鸡是python写的吗_吃鸡游戏也是用Python写的?学了Python,120个月年终奖向你招手~...
原标题:吃鸡游戏也是用Python写的?学了Python,120个月年终奖向你招手~ 吃鸡游戏火爆全球,已经把腾讯的<王者荣耀>都比下去了,有传言,腾讯给"王者荣耀"开 ...
最新文章
- mongodb重命名集合、数据库
- ESX中的Linux热添加磁盘
- mysql数据库支持的锁粒度包括_1. Mysql的并发(锁策略、锁粒度、事务)
- 认识Backbone (四)
- Java开发语句和代码块模板
- ubuntu下硬盘相关
- C++之TR1::function
- python基础知识-8-三元和一行代码(推导式)
- dom contains 包含关系
- 华为pap和chap的配置。
- Mybatis MySQL批量更新
- mysql8和php7不能连接_php无法连接mysql8.x
- C++ linux系统api
- 相机成像原理RAW,RGB,YUV
- 迭代法动态生成谢尔宾斯基三角形
- jsp医疗报销管理系统 myeclipse开发技术 mysql数据库
- 使用MIPS完成汇编程序——选择排序实现
- 原生小程序实现手风琴
- 零基础python爬虫基础之王者荣耀图片下载(超级简单)
- 实验五 java gui(预习报告)
热门文章
- SAP UI5 ODataWrapper
- manually set focus for tag library
- How is account image maintained in CRM rendered in Fiori
- 把日志文件从Linux服务器拷贝到Windows上
- WebSocket客户端连接成功后,返回的socket里有用的字段
- SAP CRM HANA report filter的工作原理
- 使用VM Tools让VMware虚拟机里的ubuntu能够共享Windows系统的文件夹
- SAP CRM和C4C的客户主数据修改历史记录查询
- python大数据运维库_大数据集群运维(10)Pycharm下安装模块
- geoserver 3_SD 2-3/15 PR调速阀德国HAWE哈威