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快排的效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: polybase配置 sql_Hadoo
- 下一篇: 任正非:美国制裁期间 华为完成1.3万颗