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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

什么是python编程例子_案例详解:优化Python编程的4个妙招

發(fā)布時間:2024/9/3 python 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 什么是python编程例子_案例详解:优化Python编程的4个妙招 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

全文共3510字,預計學習時長7分鐘

作為數(shù)據(jù)科學家,敲出最優(yōu)的Python代碼非常非常重要。別無他法,雜亂低效的代碼筆記本會消耗你的時間,也會浪費大量項目資金。經(jīng)驗豐富的數(shù)據(jù)科學家和專業(yè)人士都很清楚,這樣是沒辦法和客戶合作的。

本文將列出4個可行的Python代碼優(yōu)化方法,以便大家日后應用到自己的數(shù)據(jù)科學項目中。

什么是最優(yōu)化?

首先來看一個直觀的例子,然后定義什么是最優(yōu)化。

問題是這樣的:

假設有一個數(shù)組,其中每個指數(shù)代表一個城市,指數(shù)的值代表該城市和下一個城市之間的距離。已知兩個指數(shù),求這兩個指數(shù)間的距離。簡單來講,就是求任意兩個指數(shù)間的總值。

大家肯定首先會想到這里可以用for循環(huán)。但是如果一共有十幾萬個城市,每秒會收到五萬多個查詢需求呢?這種情況下,for循環(huán)還是這個問題的最優(yōu)解嗎?

不是了吧。此時就該揮動優(yōu)化代碼的仙女棒了。

代碼最優(yōu)化,簡單來講,就是在保證結果正確的前提下盡可能減少執(zhí)行任務的運算量。

來算算for循環(huán)完成任務所需的運算量吧:

首先計算出上面數(shù)組中指數(shù)1和3代表的城市間的距離。

指數(shù)1和3代表城市之間的距離=(0+20+6+10)=36=>3次算術運算。

如果數(shù)組大小為100000,需求數(shù)量為50000呢?

數(shù)組總大小為100000。

需求總數(shù)為50000。

假設兩指數(shù)間的平均差異為1000。

完成該任務的算術運算總量近似值為50000*1000=50000000

這個數(shù)量非常龐大。如果數(shù)據(jù)和查詢量不斷增加,for循環(huán)將會花費更多的時間。如果想減少計算量,同時又想得到正確的結果,應該采取什么優(yōu)化方法呢?

這里,使用前綴數(shù)組來計算距離是一種可能的優(yōu)化方案。它是這樣運算的:

大家能理解這里的做法嗎?這樣只需一次計算就得到了同樣的城市距離!這一方法最棒的地方就是,不管指數(shù)間的差距是1還是100000,只需一次計算就能算出任意兩個指數(shù)間的距離。是不是很神奇?

我們用10萬的數(shù)組和5萬查詢量創(chuàng)建了一個樣本數(shù)據(jù)集。在下面的在線編程窗口中比較兩種方法所需的時間。

注意:數(shù)據(jù)集總查詢量為5萬,你可以改變execute_queries參數(shù),執(zhí)行不超過5萬的任一查詢數(shù)量,看看每種方法完成任務所花費的時間。

最優(yōu)化不僅能節(jié)省時間,大大加快完成速度,還能節(jié)省計算能力!

這些要怎么應用于數(shù)據(jù)科學項目呢?大家可能已經(jīng)注意到了,很多時候需要對大量數(shù)據(jù)點進行相同查詢,尤其是數(shù)據(jù)預處理階段。

所以,在編程中運用最優(yōu)化方法,從而盡可能快速有效地完成任務至關重要。以下就來分享幾個提升優(yōu)化Python代碼的方法。

1. Pandas.apply() – 特征工程瑰寶

Pandas 庫已經(jīng)非常優(yōu)化了,但是大部分人都沒有發(fā)揮它的最大作用。想想它一般會用于數(shù)據(jù)科學項目中的哪些地方。

一般首先能想到的就是特征工程,即用已有特征創(chuàng)造新特征。其中最高效的方法之一就是Pandas.apply(),即Pandas中的apply函數(shù)。

在Pandas.apply()中,可以傳遞用戶定義功能并將其應用到Pandas Series的所有數(shù)據(jù)點中。這個函數(shù)是Pandas庫最好的擴展功能之一,它能根據(jù)所需條件分隔數(shù)據(jù)。之后便能將其有效應用到數(shù)據(jù)處理任務中。

試著用推特的情感分析數(shù)據(jù)來計算每條推文的字數(shù)吧。可以使用dataframe iterrows函數(shù)、NumPy程序庫和apply函數(shù)等方法,再在下面的在線編程窗口中進行比較。

數(shù)據(jù)集可在此處下載:https://datahack.analyticsvidhya.com/contest/practice-problem-twitter-sentiment-analysis/?utm_source=blog&utm_medium=4-methods-optimize-python-code-data-science

apply比iterrows函數(shù)快多了。它的性能和NumPy類似,但是卻更加靈活。

文檔:https://datahack.analyticsvidhya.com/contest/practice-problem-twitter-sentiment-analysis/?utm_source=blog&utm_medium=4-methods-optimize-python-code-data-science

2. Pandas.DataFrame.loc – Python數(shù)據(jù)操作絕妙技巧

所有和數(shù)據(jù)處理打交道的數(shù)據(jù)科學家(差不多所有人了!)都應該學會這個方法。

很多時候,數(shù)據(jù)科學家需要根據(jù)一些條件更新數(shù)據(jù)集中某列的某些值。Pandas.DataFrame.loc就是此類問題最優(yōu)的解決方法。

試試用它來解決下面這個問題吧。

數(shù)據(jù)集可在此處下載:https://drive.google.com/file/d/1VwXDA27zgx5jIq8C7NQW0A5rtE95e3XI/view?usp=sharing

# importing libraries

import pandas as pd

data = pd.read_csv('school.csv')

data.head()

檢查“City”變量的值計算:

現(xiàn)在,假設只需要排名前五位的城市,其他城市替換為“Others”,試著做一下:

# save the top cities in a list

top_cities = ['Brooklyn','Bronx','Manhattan','Jamaica','Long Island City']

# use loc to update the target

data.loc[(data.City.isin(top_cities) == False),'City'] = 'Others'

# city value counts

data.City.value_counts()

看到更新這些值有多簡單了嗎?完成此類數(shù)據(jù)操作任務最好的方法就是它了。

3. Python函數(shù)向量化

另一種解決緩慢循環(huán)的方法就是將函數(shù)向量化。這意味著新建函數(shù)會應用于輸入列表,并返回結果數(shù)組。在Python中使用向量化能至少迭代兩次,從而加速計算。

事實上,這樣不僅能加速代碼運算,還能讓代碼更加簡潔清晰。

4. Python多重處理

多重處理能使系統(tǒng)同時支持一個以上的處理器。

此處將數(shù)據(jù)處理分成多個任務,讓它們各自獨立運行。處理龐大的數(shù)據(jù)集時,即使是apply函數(shù)也顯得有些遲緩。

所以,來看看Python中的多重處理庫怎么大顯神通吧。

先隨機創(chuàng)建一百萬個點,然后計算每個點的除數(shù)。比較apply函數(shù)和多重處理完成這一任務的性能:

# importing required libraries

import pandas as pd

import math

import multiprocessing as mp

from random import randint

# function to calculate the number of divisors

def countDivisors(n) :

count = 0

for i in range(1, (int)(math.sqrt(n)) + 1) :

if (n % i == 0) :

if (n / i == i) :

count = count + 1

else :

count = count + 2

return count

# create random data

random_data = [randint(10,1000) for i in range(1,1000001)]

data = pd.DataFrame({'Number' : random_data })

data.shape

%%time

data['Number_of_divisor'] = data.Number.apply(countDivisors)

%%time

pool = mp.Pool(processes = (mp.cpu_count() - 1))

answer = pool.map(countDivisors,random_data)

pool.close()

pool.join()

這個問題中,多重處理生成的輸出比apply函數(shù)快了13倍。它的性能可能會隨著硬件系統(tǒng)不同而有所變化,但是必定會提升性能。

留言 點贊 關注

我們一起分享AI學習與發(fā)展的干貨

如需轉載,請后臺留言,遵守轉載規(guī)范

總結

以上是生活随笔為你收集整理的什么是python编程例子_案例详解:优化Python编程的4个妙招的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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