日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python编码效率高吗_【原创】杠精的日常-讨论python快排的效率

發(fā)布時間:2023/12/19 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python编码效率高吗_【原创】杠精的日常-讨论python快排的效率 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

事情的起因是我的一個回答:

里面的大佬提供了一個快排算法

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。