乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Pandarallel 一個能讓你的Pandas計算火力拉滿的工具

       禁忌石 2022-11-19 發(fā)布于浙江

      沒有使用
      Pandarallel

      文章圖片1

      使用了
      Pandarallel

      文章圖片2

      眾所周知,由于GIL的存在,Python單進程中的所有操作都是在一個CPU核上進行的,所以為了提高運行速度,我們一般會采用多進程的方式。而多進程無非就是以下幾種方案:

      • multiprocessing

      • concurrent.futures.ProcessPoolExecutor()

      • joblib

      • ppserver

      • celery

      這些方案對于普通Pandas玩家來說都不是特別友好,怎樣才能算作一個友好的并行處理方案?

      那就是原來的邏輯我基本不用變,僅修改需要計算的那行就能完成我們目標的方案,而 pandarallel 就是一個這樣友好的工具。

      沒有并行計算(原始pandas)

      pandarallel

      df.apply(func)

      df.parallel_apply(func)

      df.applymap(func)

      df.parallel_applymap(func)

      df.groupby(args).apply(func)

      df.groupby(args).parallel_apply(func)

      df.groupby(args1).col_name.rolling(args2).apply(func)

      df.groupby(args1).col_name.rolling(args2).parallel_apply(func)

      df.groupby(args1).col_name.expanding(args2).apply(func)

      df.groupby(args1).col_name.expanding(args2).parallel_apply(func)

      series.map(func)

      series.parallel_map(func)

      series.apply(func)

      series.parallel_apply(func)

      series.rolling(args).apply(func)

      series.rolling(args).parallel_apply(func)

      可以看到,在 pandarallel 的世界里,你只需要替換原有的 pandas 處理語句就能實現(xiàn)多CPU并行計算。非常方便、非常nice.

      文章圖片3

      在4核CPU的性能測試上,它比原始語句快了接近4倍。測試條件(OS: Linux Ubuntu 16.04,Hardware: Intel Core i7 @ 3.40 GHz - 4 cores),這就是我所說的,它把CPU充分利用了起來。

      下面就給大家介紹這個模塊怎么用,其實非常簡單,任何代碼只需要加幾行代碼就能實現(xiàn)質(zhì)的飛躍。

      1.準備

      首先需要你的電腦安裝好了Python環(huán)境,并且安裝好了Python開發(fā)工具。

      如果你還沒有安裝,可以參考以下文章:

      如果僅用Python來處理數(shù)據(jù)、爬蟲、數(shù)據(jù)分析或者自動化腳本、機器學(xué)習(xí)等,建議使用Python基礎(chǔ)環(huán)境+jupyter即可,安裝使用參考Windows/Mac 安裝、使用Python環(huán)境+jupyter notebook

      如果想利用Python進行web項目開發(fā)等,建議使用Python基礎(chǔ)環(huán)境+Pycharm,安裝使用參考 :Windows下安裝、使用Pycharm教程,這下全了Mac下玩轉(zhuǎn)Python-安裝&使用Python/PyCharm

      請選擇以下任一種方式輸入命令安裝依賴
      1. Windows 環(huán)境 打開 Cmd (開始-運行-CMD)。
      2. MacOS 環(huán)境 打開 Terminal (command+空格輸入Terminal)。
      3. 如果你用的是 VSCode編輯器 或 Pycharm,可以直接使用界面下方的Terminal.

      pip install pandarallel

      對于windows用戶,有一個不好的消息是,它只能在Windows的linux子系統(tǒng)上運行(WSL),你可以在微軟官網(wǎng)上找到安裝教程:

      https://docs.microsoft.com/zh-cn/windows/wsl/about

      2.使用Pandarallel

      使用前,需要對Pandarallel進行初始化:

      from pandarallel import pandarallel
      pandarallel.initialize()

      這樣才能調(diào)用并行計算的API,不過 initialize 中有一個重要參數(shù)需要說明,那就是 nb_workers ,它將指定并行計算的Worker數(shù),如果沒有設(shè)置,所有CPU的核都會用上。

      Pandarallel一共支持8種Pandas操作,下面是一個apply方法的例子。

      import pandas as pd
      import time
      import math
      import numpy as np
      from pandarallel import pandarallel

      # 初始化
      pandarallel.initialize()
      df_size = int(5e6)
      df = pd.DataFrame(dict(a=np.random.randint(1, 8, df_size),
      b=np.random.rand(df_size)))
      def func(x):
      return math.sin(x.a**2) + math.sin(x.b**2)

      # 正常處理
      res = df.apply(func, axis=1)

      # 并行處理
      res_parallel = df.parallel_apply(func, axis=1)

      # 查看結(jié)果是否相同
      res.equals(res_parallel)

      其他方法使用上也是類似的,在原始的函數(shù)名稱前加上 parallel_,比如 DataFrame.groupby.apply:

      import pandas as pd
      import time
      import math
      import numpy as np
      from pandarallel import pandarallel

      # 初始化
      pandarallel.initialize()
      df_size = int(3e7)
      df = pd.DataFrame(dict(a=np.random.randint(1, 1000, df_size),
      b=np.random.rand(df_size)))
      def func(df):
      dum = 0
      for item in df.b:
      dum += math.log10(math.sqrt(math.exp(item**2)))

      return dum / len(df.b)

      # 正常處理
      res = df.groupby('a').apply(func)
      # 并行處理
      res_parallel = df.groupby('a').parallel_apply(func)
      res.equals(res_parallel)

      又比如 DataFrame.groupby.rolling.apply:

      import pandas as pd
      import time
      import math
      import numpy as np
      from pandarallel import pandarallel

      # 初始化
      pandarallel.initialize()
      df_size = int(1e6)
      df = pd.DataFrame(dict(a=np.random.randint(1, 300, df_size),
      b=np.random.rand(df_size)))
      def func(x):
      return x.iloc[0] + x.iloc[1] ** 2 + x.iloc[2] ** 3 + x.iloc[3] ** 4

      # 正常處理
      res = df.groupby('a').b.rolling(4).apply(func, raw=False)
      # 并行處理
      res_parallel = df.groupby('a').b.rolling(4).parallel_apply(func, raw=False)
      res.equals(res_parallel)

      案例都是類似的,這里就直接列出表格,不浪費大家寶貴的時間去閱讀一些重復(fù)的例子了:

      沒有并行計算(原始pandas)

      pandarallel

      df.apply(func)

      df.parallel_apply(func)

      df.applymap(func)

      df.parallel_applymap(func)

      df.groupby(args).apply(func)

      df.groupby(args).parallel_apply(func)

      df.groupby(args1).col_name.rolling(args2).apply(func)

      df.groupby(args1).col_name.rolling(args2).parallel_apply(func)

      df.groupby(args1).col_name.expanding(args2).apply(func)

      df.groupby(args1).col_name.expanding(args2).parallel_apply(func)

      series.map(func)

      series.parallel_map(func)

      series.apply(func)

      series.parallel_apply(func)

      series.rolling(args).apply(func)

      series.rolling(args).parallel_apply(func)

      3.注意事項

      1. 我有 8 個 CPU,但 parallel_apply 只能加快大約4倍的計算速度。為什么?

      答:正如我前面所言,Python中每個進程占用一個核,Pandarallel 最多只能加快到你所擁有的核心的總數(shù),一個 4 核的超線程 CPU 將向操作系統(tǒng)顯示 8 個 CPU,但實際上只有 4 個核心,因此最多加快4倍。

      2. 并行化是有成本的(實例化新進程,通過共享內(nèi)存發(fā)送數(shù)據(jù),...),所以只有當并行化的計算量足夠大時,并行化才是有意義的。對于很少量的數(shù)據(jù),使用 Pandarallel 并不總是值得的。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多