python编码效率高吗_【原创】杠精的日常-讨论python快排的效率
事情的起因是我的一個回答:
里面的大佬提供了一個快排算法
def 快排(a):
return a and 快排([i for i in a if ia[0]])
一行代碼寫的十分優(yōu)雅。
于是我寫了如下代碼進(jìn)行對比
import time
import numpy as np
from random import random
from astartool.number import equals_zero_all
npa = np.array
def qsort1(a: list):
"""
知乎網(wǎng)友 劃船協(xié)會 主頁地址 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):
"""
我的代碼--快排
利用棧實(shí)現(xiàn)的快速排序(非遞歸算法)
: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):
"""
測試函數(shù)
:param l: 數(shù)據(jù)規(guī)模
:return: 知乎網(wǎng)友劃船協(xié)會提供在代碼時間, 我自己寫在代碼在時間, 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)
運(yùn)行結(jié)果為
(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)
以上元祖每組分別是隨機(jī)100、500、1000、10000、100000、1000000個隨機(jī)數(shù)進(jìn)行排序所需要的時間。
每個元祖分別代表 知乎網(wǎng)友劃船協(xié)會提供在代碼(以后簡寫成代碼1)時間, 我自己寫在代碼(以后簡寫成代碼2)在時間, list.sort(以后簡稱成代碼3)時間, sorted(以后簡寫成代碼4)的時間
看起來, 雖然代碼1簡練優(yōu)雅,但是實(shí)際上缺乏執(zhí)行效率。代碼2代碼雖然冗長,但是執(zhí)行效率稍微高一點(diǎn)。系統(tǒng)函數(shù)代碼3和代碼4效率相差不明顯,但是明顯優(yōu)于代碼1和代碼2。
那么為什么代碼1會稍微慢一些呢?
我認(rèn)為主要在以下的方面代碼1在遞歸的過程中不斷生成新的列表,遞歸耗時和列表生成存在耗時(不僅耗時,而且耗空間)
代碼每一趟的計(jì)算上,代碼2掃1遍列表得到的兩部分。而代碼1是掃了3遍表并且把表分成了3部分。又因?yàn)殡S機(jī)數(shù)的原因,導(dǎo)致代碼1中的第二部分元素等于a[0]的列表元素個數(shù)基本上會等于1。三部分的列表還是相當(dāng)于把元素分成兩部分。
不過呢,比較之后,也給了我們一些啟示盡量使用自帶的工具。能不造輪子就不造輪子。(自己手?jǐn)]執(zhí)行效率又低,還浪費(fèi)時間)
簡練的東西執(zhí)行效率不一定高。
不過嘛,個人喜好而言,雖然執(zhí)行效率不高,我還是更加喜歡代碼1,符合簡單即美的python哲學(xué)。關(guān)鍵問題還是--這種寫法實(shí)在太秀了。
總結(jié)
以上是生活随笔為你收集整理的python编码效率高吗_【原创】杠精的日常-讨论python快排的效率的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: polybase配置 sql_Hadoo
- 下一篇: 基于python的文件加密传输系统 毕业