Python 我已经启动了8个线程,但CPU使用率几乎与单线程相同

Python 我已经启动了8个线程,但CPU使用率几乎与单线程相同,python,multithreading,dataframe,cpu-usage,Python,Multithreading,Dataframe,Cpu Usage,我想迭代数据帧的列,并从中提取id值。然后,我使用“FindIdInColumn”函数中的“callback”函数从这些Id值创建新列。这个过程花了很多时间。根据windows任务管理器,CPU使用率仅为40%左右。在那之后,我修改了程序以在8个线程中运行它。我有核心i5第七代CPU。脚本中有8个函数调用。现在,这8个函数调用在线程中并行完成。所以,我预计CPU的使用率会急剧上升。但它仍然几乎是一样的。下面是我正在使用的代码 import math import json from dateti

我想迭代数据帧的列,并从中提取id值。然后,我使用“FindIdInColumn”函数中的“callback”函数从这些Id值创建新列。这个过程花了很多时间。根据windows任务管理器,CPU使用率仅为40%左右。在那之后,我修改了程序以在8个线程中运行它。我有核心i5第七代CPU。脚本中有8个函数调用。现在,这8个函数调用在线程中并行完成。所以,我预计CPU的使用率会急剧上升。但它仍然几乎是一样的。下面是我正在使用的代码

import math
import json
from datetime import datetime
import pandas as pd
import numpy as np
import threading

dataFrameTrain = pd.read_csv('../Data/train.csv')


def FindIdInColumn(lock,column,callBack,fieldName):
    for i in range(0,len(column)):
        collectionJson = column[i]
        if type(collectionJson) !=str or collectionJson == '':
            continue
        idIndex = 0
        idIndex = collectionJson.find(fieldName,idIndex,len(collectionJson))
        while idIndex != -1:
            idStr = ''
            j = idIndex+5
            while j<len(collectionJson) and collectionJson[j]!=',':
                if not(collectionJson[j].isspace()) and collectionJson[j].isnumeric():
                    idStr = idStr + collectionJson[j]
                j=j+1
            callBack(i,idStr,lock)
            idIndex = idIndex+2
            idIndex = collectionJson.find(fieldName,idIndex,len(collectionJson))


def CreateOrAddValueToCol(i,colName,lock):
    lock.acquire()
    dataFrameTrain.at[i,colName] = 1
    lock.release()

def AddValueToCollectionColumn(i,value,lock):
    lock.acquire()
    dataFrameTrain.at[i,'belongs_to_collection'] = value
    lock.release()


lock = threading.Lock()
t1 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['genres'],CreateOrAddValueToCol,'\'id\''))
t2 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['production_companies'],CreateOrAddValueToCol,'\'id\''))
t3 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['production_countries'],CreateOrAddValueToCol,'\'name\''))
t4 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['Keywords'],CreateOrAddValueToCol,'\'id\''))
t5 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['Keywords'],CreateOrAddValueToCol,'\'id\''))
t6 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['cast'],CreateOrAddValueToCol,'\'id\''))
t7 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['crew'],CreateOrAddValueToCol,'\'id\''))
t8 = threading.Thread(target=FindIdInColumn,args=(lock,dataFrameTrain['belongs_to_collection'],AddValueToCollectionColumn,'\'id\''))
print('thread start')
t1.start()
t2.start()
t3.start()
t4.start()            
t5.start()
t6.start()
t7.start()
t8.start()                   
t1.join()
t2.join()
t3.join()
t4.join()


t5.join()
t6.join()
t7.join()
t8.join()
导入数学
导入json
从日期时间导入日期时间
作为pd进口熊猫
将numpy作为np导入
导入线程
dataFrameTrain=pd.read_csv(“../Data/train.csv”)
def FindIdInColumn(锁、列、回调、字段名):
对于范围(0,len(列))中的i:
collectionJson=列[i]
如果输入(collectionJson)=str或collectionJson=='':
持续
idIndex=0
idIndex=collectionJson.find(字段名、idIndex、len(collectionJson))
而idIndex!=-1:
idStr=''
j=指数+5

虽然您的计算机中有多少内核,但如果没有线程,代码会运行得更快。@shiv我的系统中有4个内核。您混淆了线程和进程。尝试使用多进程和工作进程池进行重写,您会发现系统响应与预期一致。如果不持有您拥有的单个锁,您的任何线程都无法执行任何有用的工作。因此,并行工作是不可能的。你的计算机中有多少内核没有线程代码运行得更快。@shiv我的系统中有4个内核。你混淆了线程和进程。尝试使用多进程和工作进程池进行重写,您会发现系统响应与预期一致。如果不持有您拥有的单个锁,您的任何线程都无法执行任何有用的工作。因此,不可能并行工作。
import math
import json
from datetime import datetime
import pandas as pd
import numpy as np
from multiprocessing import Pool
import threading


dataFrameTrain = pd.read_csv('../Data/train.csv')

lock = threading.Lock()

def FindIdInColumn(column,callBack,fieldName):
    for i in range(0,len(column)):
        collectionJson = column[i]
        if type(collectionJson) !=str or collectionJson == '':
            continue
        idIndex = 0
        idIndex = collectionJson.find(fieldName,idIndex,len(collectionJson))
        while idIndex != -1:
            idStr = ''
            j = idIndex+5
            while j<len(collectionJson) and collectionJson[j]!=',':
                if not(collectionJson[j].isspace()) and collectionJson[j].isnumeric():
                    idStr = idStr + collectionJson[j]
                j=j+1
            callBack(i,idStr)
            idIndex = idIndex+2
            idIndex = collectionJson.find(fieldName,idIndex,len(collectionJson))


def CreateOrAddValueToCol(i,colName):
    lock.acquire()
    dataFrameTrain.at[i,colName] = 1
    lock.release()

def AddValueToCollectionColumn(i,value):
    lock.acquire()
    dataFrameTrain.at[i,'belongs_to_collection'] = value
    lock.release()




pool = Pool(4)
pool.starmap(FindIdInColumn, [(dataFrameTrain['genres'],CreateOrAddValueToCol,'\'id\''), (dataFrameTrain['production_companies'],CreateOrAddValueToCol,'\'id\''),(dataFrameTrain['production_countries'],CreateOrAddValueToCol,'\'name\''),(dataFrameTrain['Keywords'],CreateOrAddValueToCol,'\'id\''),(dataFrameTrain['Keywords'],CreateOrAddValueToCol,'\'id\''),(dataFrameTrain['crew'],CreateOrAddValueToCol,'\'id\''),(dataFrameTrain['belongs_to_collection'],AddValueToCollectionColumn,'\'id\'')])