成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Pandas字符串操作的各種方法速度測試

開發 測試
由于LLM的發展, 很多的數據集都是以DF的形式發布的,所以通過Pandas操作字符串的要求變得越來越高了,所以本文將對字符串操作方法進行基準測試,看看它們是如何影響pandas的性能的。因為一旦Pandas在處理數據時超過一定限制,它們的行為就會很奇怪。

由于LLM的發展, 很多的數據集都是以DF的形式發布的,所以通過Pandas操作字符串的要求變得越來越高了,所以本文將對字符串操作方法進行基準測試,看看它們是如何影響pandas的性能的。因為一旦Pandas在處理數據時超過一定限制,它們的行為就會很奇怪。

我們用Faker創建了一個100,000行的測試數據。

測試方法

安裝:

!pip install faker

生成測試數據的方法很簡答:

import pandas as pd
 import numpy as np
 
 def gen_data(x):
  from faker import Faker
  fake = Faker()
  outdata = {}
  for i in range(0,x):
    outdata[i] = fake.profile()
  return pd.DataFrame(outdata).T
 
 n= 100000
 basedata = gen_data(n)

然后把Google Colab將輸出存儲在Google drive中

from google.colab import drive
 drive.mount('/content/drive')

創建了非常簡單的函數來測試連接兩個字符串的各種方法。

def process(a,b):
  return ''.join([a,b])
 
 def process(a,b):
  return a+b
 
 def process(a,b):
  return f"{a}{b}"
 
 def process(a,b):
  return f"{a}{b}"*100

創建一個空DF,編寫一個函數將輸出%%timeit作為一行添加到數據框中

# add a row to the dataframe using %%timeit output
 def add_to_df(n, m, x, outputdf):
  outputdf.loc[len(outputdf.index)] = [m, n, x]
 
 # output frame
 outputdf = pd.DataFrame(columns=['method', 'n', 'timing'])
 outputdf

然后就是運行上面的每個函數并將數據導出到pandas的代碼。

# get a sample of data
 n = 10000
 suffix = 'fstring_100x'
 data = basedata.copy().sample(n).reset_index()

記錄運行時間

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row in range(len(data)):
  data.at[row ,'newcol'] = process(data.at[row, 'job'], data.at[row, 'company'])
 
 # 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
 # <TimeitResult : 451 ms ± 34 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)>

完整的函數調用

m = "Iterating over the rows"
 add_to_df(n = n, m = m, x = vars(_), outputdf = outputdf)

試驗

上面是代碼,下面開始用上面的代碼進行試驗:

Iterrows (pandas原生函數)每行相加

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row, item in data.iterrows():
  data.at[row ,'newcol'] = process(item['job'], item['company'])

Itertuples(由于不可變而更安全)每行相加

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 for row, job, company in data[['job','company']].itertuples():
  data.at[row ,'newcol'] = process(job, company)

使用pandas原生函數作為字符串相加

%%timeit -r 7 -n 1 -o
 data['newcol'] = data.job + data.company

使用原生函數pandas. series .add

%%timeit -r 7 -n 1 -o
 data['newcol'] = data.job.add(data.company)

使用dataframe.apply

%%timeit -r 7 -n 1 -o
 data['newcol'] = data.apply(lambda row: process(row['job'],row['company']), axis=1)

使用List Map

%%timeit -r 7 -n 1 -o
 data['newcol'] = list(map(process, data.job, data.company))

Pandas矢量化

%%timeit -r 7 -n 1 -o
 data['newcol'] = process(data.job, data.company)

numpy數組矢量化

%%timeit -r 7 -n 1 -o
 data['newcol'] = process(data.job.to_numpy(), data.company.to_numpy())

顯式在numpy數組上使用numpy向量化

%%timeit -r 7 -n 1 -o
 data['newcol'] = np.vectorize(process)(data.job.to_numpy(), data.company.to_numpy())

優化后的列表推導式

%%timeit -r 7 -n 1 -o
 data['newcol'] = ''
 data['newcol'] =[process(i,j) for i,j in list(zip(data.job, data.company)) ]

最后是結果的輸出:

outputdf.to_csv(f"./drive/MyDrive/{n}_{suffix}.csv")

結果

結果如下所示。我用了上面3種不同函數測試了結果。

原生的字符串加法C = a+b

圖片

從1000行擴展到100,000行所需的時間;

圖片

可視化對比:

圖片

所有矢量化方法都非常快,而且pandas標準的str.add對numpy數組也進行了矢量化。能夠看到Pandas的原生方法一般都是線性的。List-map似乎以N的平方根的速度增長

使用fstring: c = f " {a}{b} "

使用fstring,結果很有趣,有的結果無法解釋。

圖片

時間

圖片

可視化

圖片

從時間上看,長度超過10,000的DF時,向量化是正確執行的

下圖是第三個函數,就是*100,這更能說明問題,向量化操作的基本上時間沒有變化

圖片

總結

通過上面的測試,我們可以總結一下結果:

1、還是老生常談的問題,不要使用iterrows(), itertuples(),盡量不要使用DataFrame.apply(),因為幾個函數還是循環遍歷的。

2、矢量化操作在字符串操作中也是可以使用的,但是為了安全起見,使用Numpy數組。

3、列表推導式就像它的名字一樣,它還是一個list

4、還有一些奇怪的無法解釋的問題,但是大部分的情況都是可以解釋的


責任編輯:華軒 來源: DeepHub IMBA
相關推薦

2020-10-16 18:35:53

JavaScript字符串正則表達式

2010-07-14 16:37:33

SQL Server拆

2010-09-02 10:02:17

PHP

2020-08-01 16:19:13

JavaScript字符串開發

2024-07-22 15:42:08

Linux字符串

2009-11-24 09:55:44

PHP字符串函數

2010-02-02 11:27:16

C++字符串

2010-03-11 09:56:57

Python字符串操作

2021-05-18 09:08:18

字符串子串對象

2021-07-07 10:01:55

PythonPython字符串Python基礎

2013-03-08 11:03:17

PowerShellVHDResizer虛擬磁盤

2024-08-29 08:04:14

2009-11-27 10:24:25

PHP字符串操作

2009-07-15 17:20:45

Jython字符串

2010-09-06 17:30:46

SQL函數

2021-09-10 08:18:31

Go語言字符串

2020-08-17 09:22:30

字符串子串對象

2015-08-14 09:37:44

Java字符串基本運算

2009-08-07 13:50:11

C#字符串

2022-08-14 14:54:10

Pandas字符串數字類型
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: a亚洲精品 | 久久精品中文 | 亚洲欧美一区二区在线观看 | 欧产日产国产精品国产 | 欧美激情在线一区二区三区 | 免费av直接看 | 精品国产99 | 91网站在线看 | 一级一级一级毛片 | 欧美久久一区二区 | 国产午夜精品一区二区三区嫩草 | 中文字幕乱码一区二区三区 | 久久久www成人免费精品 | 九九在线视频 | av黄色在线观看 | 日韩欧美三级在线 | 午夜私人影院在线观看 | 一区二区日本 | 成人精品鲁一区一区二区 | 国产精品激情 | 国产精品女人久久久 | 午夜免费视频 | 欧美一级片黄色 | www.99热.com| 开操网| 视频1区 | 高清免费av | 一级片免费观看 | 中文字幕国产 | 国产激情视频 | 亚洲性视频 | 欧美a v在线| www.免费看片.com | av免费网站在线观看 | 一级全黄视频 | 狠狠婷婷综合久久久久久妖精 | 性一交一乱一伦视频免费观看 | 亚洲一区视频 | 亚洲一区免费视频 | 好姑娘高清在线观看电影 | 免费观看www7722午夜电影 |