Python加速運算——"-O最佳化"和Cython

RakanLiu發表於2024-10-20

1. 以 release模式執行Python

python -O process_file.py

可以在程式碼中加入以下命令,判斷是否為release模式:

if __debug__:
    print("Debug mode")
else:
    print("Release mode")

2.使用Cython

下載Cython:

pip install cython

編寫pyx檔案,即要編譯的Python程式碼:

為了後面方便呼叫,你可以把需要執行的函式放到一個函式中,例如我放到了main()函式中

# process_file.pyx

# python -O process_file.py
import pandas as pd
from tqdm import tqdm

def clean_str(input:str)->str:
    # u"\u3000": 全形空格
    # u"\xa0": #nbsp
    # output = input.strip()\
    #                   .replace('"', '')\
    #                   .replace(u"\u3000", "")\
    #                   .replace(u"\xa0", "")\
    #                   .replace("【", "")\
    #                   .replace("】", "")\
    #                   .replace(" ", "")
    output = input.strip()\
                      .replace(u"\u3000", " ")\
                      .replace(u"\xa0", " ")\
                      .replace("【", "[")\
                      .replace("】", "]")
    return output

def main():

  file_in = "ownthink_v2\ownthink_v2.csv"
  file_out = "ownthink_v2\ownthink_v2_cleaned.csv"
  file_out_2 = "ownthink_v2\ownthink_v2_cleaned_rfiltered.csv"

  chunk_size = 10000


  # 逐塊讀取CSV檔案  
  data_all = pd.read_csv(file_in, chunksize=chunk_size)# 139951300


  # 進行資料清洗
  lc = 0  # 計數
  head_flag = True

  for data_chunk in tqdm(data_all, total=13996):
    # 刪除含有 NAN 的行 和 空行 
    data_chunk = data_chunk.dropna()
    # column_names_list = data_chunk.columns.tolist()
    for index, row in data_chunk.iterrows():
      # 實體,屬性,值
      entity = row["實體"]
      attribution = row["屬性"]
      value = row["值"]

      if entity == value:
        # 過濾掉 實體 和 值 相等的情況(比如 “英雄聯盟 中文名 英雄聯盟”)
        data_chunk = data_chunk.drop(index=index, axis="rows")
        continue
    
      # line =  entity + attribution + value 
      # if "歧義關係" in line or "歧義權重" in line:
      #   data_chunk = data_chunk.drop(index=index, axis="rows")
      #   print(line)
      #   continue

      # 進行清理,並賦值給 data_chunk
      row["實體"] = clean_str(entity)
      row["屬性"] = clean_str(attribution)
      row["值"] = clean_str(value)

      lc += 1

    # 寫入檔案
    # mode = 'a'為追加資料,index為每行的索引序號,header為標題
    if head_flag:
      data_chunk.to_csv(file_out, mode='w', index=False, header=True, encoding="utf-8")
      head_flag = False
    else:
      data_chunk.to_csv(file_out, mode='a', index=False, header=False, encoding="utf-8")

    # if lc > 10000:
    #   break

  print(lc)

編寫setup.py檔案,使得 Cython 可以將我們的 Python 程式碼編譯成 C 程式碼:

# setup.py
from setuptools import setup
from Cython.Build import cythonize


setup(
    ext_modules = cythonize('process_file.pyx')
)

接著,執行命令:

python setup.py build_ext --inplace

這樣會生成build資料夾,.cpp檔案,.pyd檔案,其中,build資料夾.pyd檔案是對你有用的;

你可以在Python程式碼中呼叫編譯好的cython檔案:

from process_file import main

main()

相關文章