免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
一種將Python速度提高1000倍的解決方案

人們說Python很慢,可能會很慢

每當(dāng)出現(xiàn)編程速度競賽時,Python通常都會走到最底層。有人說這是因為Python是一種解釋語言。所有的解釋語言都很慢。但是我們知道Java也是一種語言,它的字節(jié)碼由JVM解釋。

https://benchmarksgame-team.pages.debian.net/benchmarksgame/fastest/python3-java.html

如本基準(zhǔn)測試所示,Java比Python快得多。

這是一個可以演示Python慢度的示例。使用傳統(tǒng)的for循環(huán)產(chǎn)生倒數(shù):

import numpy as npnp.random.seed(0)values = np.random.randint(1, 100, size=1000000)def get_reciprocal(values): output = np.empty(len(values)) for i in range(len(values)): output[i] = 1.0/values[i]%timeit get_reciprocal(values)

結(jié)果:

每個循環(huán)3.37 s±582毫秒(平均±標(biāo)準(zhǔn)偏差,共7次運(yùn)行,每個循環(huán)1次)

神圣的xxx,計算1,000,000個倒數(shù)需要3.37s。C語言中的相同邏輯只需要眨一下就可以了:9ms ; C#需要19毫秒; Nodejs花費26ms ; Java需要5毫秒!而Python則采用了自我懷疑的3.37秒。(我在最后附加了所有測試代碼)。

緩慢的根本原因

我們通常將Python稱為動態(tài)類型編程語言。而且Python程序中的所有內(nèi)容都是object,換句話說,每次Python代碼處理數(shù)據(jù)時,都需要將對象包裝拆箱。在for循環(huán)內(nèi)部,每次迭代都需要拆箱對象,檢查類型并計算倒數(shù)。那3秒鐘都在類型檢查中浪費了。

與C之類的傳統(tǒng)語言不同,對數(shù)據(jù)的訪問是直接的,而在Python中,大量的CPU周期用于檢查類型。

即使是簡單的數(shù)字分配也將花費很長時間。

a = 1步驟1.設(shè)置a->PyObject_HEAD->typecode為整數(shù)步驟2.設(shè)置a->val =1
那么,有沒有一種方法可以解決類型檢查,從而提高性能呢?

解決方案:NumPy通用函數(shù)

與Python列表不同,NumPy數(shù)組是圍繞C數(shù)組構(gòu)建的對象。NumPy中的訪問項無需任何步驟即可檢查類型。這使我們了解了解決方案,它是NumPy通用函數(shù)(又稱UFunc)

簡而言之,UFunc是一種我們可以直接對整個數(shù)組進(jìn)行算術(shù)運(yùn)算的方法。將第一個慢速Python示例轉(zhuǎn)換為UFunc版本,它將像這樣:

import numpy as npnp.random.seed(0)values = np.random.randint(1, 100, size=1000000)%timeit result = 1.0/values

此代碼不僅可以提高速度,還可以縮短代碼長度。猜猜現(xiàn)在需要多少時間?比我上面提到的任何其他語言快2.7ms

每個循環(huán)2.71 ms±50.8 μs(平均±標(biāo)準(zhǔn)偏差,共運(yùn)行7次,每個循環(huán)100個)
返回代碼,關(guān)鍵是1.0/values這里是不是一個數(shù)字,它是一個NumPy的陣列。像除法運(yùn)算符一樣,還有很多其他運(yùn)算符。

檢查這里的所有Ufunc運(yùn)營商。

對于那些使用Python的人,您很有可能使用Python處理數(shù)據(jù)和數(shù)字。這些數(shù)據(jù)可以存儲在NumPy或Pandas DataFrame中,因為DataFrame是基于NumPy實現(xiàn)的。因此,Ufunc也可以。

UFunc使我們能夠在Python中以數(shù)量級更快的速度執(zhí)行重復(fù)操作。最慢的Python甚至可以比C語言更快。太棒了。

附錄— C,C#,Java和NodeJS的測試代碼

C語言:

#include <stdio.h>#include <stdlib.h>#include <sys/time.h>
int main(){ struct timeval stop, start; gettimeofday(&start, NULL); int length = 1000000; int rand_array[length]; float output_array[length]; for(int i = 0; i<length; i++){ rand_array[i] = rand(); } for(int i = 0; i<length; i++){ output_array[i] = 1.0/(rand_array[i]*1.0); } gettimeofday(&stop, NULL); printf("took %lu us\n", (stop.tv_sec - start.tv_sec) * 1000000 + stop.tv_usec - start.tv_usec); printf("done\n"); return 0;}

C#(dotnet 5.0):

using System;namespace speed_test{ class Program{ static void Main(string[] args){ int length = 1000000; double[] rand_array =new double[length]; double[] output = new double[length]; var rand = new Random(); for(int i =0; i<length;i++){ rand_array[i] = rand.Next(); //Console.WriteLine(rand_array[i]); } long start = DateTimeOffset.Now.ToUnixTimeMilliseconds(); for(int i =0;i<length;i++){ output[i] = 1.0/rand_array[i]; } long end = DateTimeOffset.Now.ToUnixTimeMilliseconds(); Console.WriteLine(end - start); } }}

Java:

import java.util.Random;
public class speed_test { public static void main(String[] args){ int length = 1000000; long[] rand_array = new long[length]; double[] output = new double[length]; Random rand = new Random (); for(int i =0; i<length; i++){ rand_array[i] = rand.nextLong(); } long start = System.currentTimeMillis(); for(int i = 0;i<length; i++){ output[i] = 1.0/rand_array[i]; } long end = System.currentTimeMillis(); System.out.println(end - start); }}

NodeJS:

let length = 1000000;let rand_array = [];let output = [];for(var i=0;i<length;i++){ rand_array[i] = Math.floor(Math.random()*10000000);}let start = (new Date()).getMilliseconds();for(var i=0;i<length;i++){ output[i] = 1.0/rand_array[i];}let end = (new Date()).getMilliseconds();console.log(end - start);
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Python最牛逼數(shù)據(jù)分析庫!月薪35K大牛:整理的NumPy詳細(xì)教程!
numpy.array 操作簡單總結(jié)
Python 數(shù)據(jù)操作教程:NUMPY 教程與練習(xí)
Python生成隨機(jī)數(shù)組的方法小結(jié)
NumPy
Python中的Numpy入門教程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服