Quero saber o número de CPUs na máquina local usando Python. O resultado deve ser a user/real
saída time(1)
quando chamado com um programa somente para espaço do usuário da escala ideal.
python
system-information
phihag
fonte
fonte
/proc/<PID>/status
possui algumas linhas que informam o número de CPUs no cpuset atual: procureCpus_allowed_list
.Respostas:
Se você tem python com uma versão> = 2.6, pode simplesmente usar
http://docs.python.org/library/multiprocessing.html#multiprocessing.cpu_count
fonte
os.cpu_count()
Se você estiver interessado no número de processadores disponíveis para o seu processo atual, verifique primeiro o cpuset . Caso contrário (ou se o cpuset não estiver em uso),
multiprocessing.cpu_count()
é o caminho a seguir no Python 2.6 e mais recente. O método a seguir recai em alguns métodos alternativos nas versões mais antigas do Python:fonte
/proc/self/status
são respectivamente ff, ef ef --- correspondentes a 8, 4 e 4 pela sua matemática (correta). No entanto, os números reais de CPUs são respectivamente 4, 2 e 1. Acho que contar o número de ocorrências da palavra "processador"/proc/cpuinfo
pode ser o melhor caminho a percorrer. (Ou eu tenho o errado pergunta?)/proc/cpuinfo
disso, se para qualquer uma das listagens de cada "processador" você multiplica os "irmãos" pelos "núcleos da CPU" você obtém seu número "Cpus_allowed". E entendo que os irmãos se referem à hiper-segmentação, daí a sua referência a "virtual". Mas o fato é que seu número "permitido por Cpus" é 8 no meu MacPro, enquanto suamultiprocessing.cpu_count()
resposta é 4. A minhaopen('/proc/cpuinfo').read().count('processor')
também produz 4, o número de núcleos físicos (dois processadores de núcleo duplo).open('/proc/self/status').read()
esquece de fechar o arquivo. Use emwith open('/proc/self/status') as f: f.read()
vez dissoos.cpu_count()
with
-lo quando encontrar um caso em que você precise.Outra opção é usar a
psutil
biblioteca, que sempre é útil nessas situações:Isso deve funcionar em qualquer plataforma suportada por
psutil
(Unix e Windows).Observe que, em algumas ocasiões,
multiprocessing.cpu_count
pode demorar umNotImplementedError
poucopsutil
para conseguir o número de CPUs. Isso ocorre simplesmente porquepsutil
primeiro tenta usar as mesmas técnicas usadasmultiprocessing
e, se elas falharem, também usa outras técnicas.fonte
psutil.cpu_count(logical = True)
psutil.cpu_count()
obtém 12 (é uma CPU de 6 núcleos com hyperthreading). Isso ocorre porque o argumento padrão delogical
é True, então você precisa escrever explicitamentepsutil.cpu_count(logical = False)
para obter o número de núcleos físicos.No Python 3.4 ou superior : os.cpu_count () .
multiprocessing.cpu_count()
é implementado em termos dessa função, mas aumentaNotImplementedError
seos.cpu_count()
retornaNone
("não é possível determinar o número de CPUs").fonte
cpu_count
.len(os.sched_getaffinity(0))
pode ser melhor, dependendo da finalidade.os.cpu_count()
OP solicita) pode diferir do número de CPUs disponíveis para o processo atual (os.sched_getaffinity(0)
).os.sched_getaffinity(0)
está disponível no BSD, portanto é necessário o uso de (sem outra biblioteca externa).os.cpu_count()
len(os.sched_getaffinity(0))
é o que você geralmente querhttps://docs.python.org/3/library/os.html#os.sched_getaffinity
os.sched_getaffinity(0)
(adicionado em Python 3) retorna o conjunto de CPUs disponíveis, considerando asched_setaffinity
chamada do sistema Linux , que limita em quais CPUs um processo e seus filhos podem executar.0
significa obter o valor para o processo atual. A função retorna umaset()
das CPUs permitidas, portanto, a necessidadelen()
.multiprocessing.cpu_count()
por outro lado, apenas retorna o número total de CPUs físicas.A diferença é especialmente importante porque certos sistemas de gerenciamento de cluster, como o Platform LSF, limitam o uso da CPU do trabalho
sched_getaffinity
.Portanto, se você usar
multiprocessing.cpu_count()
, seu script pode tentar usar muito mais núcleos do que os disponíveis, o que pode levar a sobrecarga e tempo limite.Podemos ver a diferença concretamente restringindo a afinidade com a
taskset
utilidade.Por exemplo, se eu restringir o Python a apenas 1 núcleo (núcleo 0) no meu sistema de 16 núcleos:
com o script de teste:
main.py
então a saída é:
nproc
no entanto, respeita a afinidade por padrão e:saídas:
e
man nproc
deixa isso bem explícito:nproc
possui o--all
sinalizador para o caso menos comum em que você deseja obter a contagem física de CPU:A única desvantagem desse método é que ele parece ser apenas UNIX. Suponho que o Windows deve ter uma API de afinidade semelhante, possivelmente
SetProcessAffinityMask
, então me pergunto por que não foi portada. Mas não sei nada sobre o Windows.Testado no Ubuntu 16.04, Python 3.5.2.
fonte
Se você deseja saber o número de núcleos físicos (não núcleos virtuais com hyperthread), aqui está uma solução independente de plataforma:
https://github.com/giampaolo/psutil/blob/master/INSTALL.rst
Observe que o valor padrão para
logical
éTrue
, portanto, se você deseja incluir núcleos com hyperthread, pode usar:Isso fornecerá o mesmo número que
os.cpu_count()
emultiprocessing.cpu_count()
, nenhum dos quais possui ological
argumento de palavra - chave.fonte
psutil.cpu_count(logical=False) #4
psutil.cpu_count(logical=True) #8
emultiprocessing.cpu_count() #8
Isso fornece a contagem de CPU com hyperthread
multiprocessing.cpu_count()
os.cpu_count()
Isso fornece a contagem de CPU da máquina virtual
psutil.cpu_count()
numexpr.detect_number_of_cores()
Só importa se você trabalha em VMs.
fonte
os.cpu_count()
emultiprocessing.cpu_count()
retornará as contagens de CPU com hyperthread, e não a contagem física real da CPU.multiprocessing.cpu_count()
retornará o número de CPUs lógicas; portanto, se você tiver uma CPU quad-core com hyperthreading, ela retornará8
. Se você deseja o número de CPUs físicas, use as ligações python para hwloc:O hwloc foi projetado para ser portátil em sistemas operacionais e arquiteturas.
fonte
psutil.cpu_count(logical=False)
Não é possível descobrir como adicionar ao código ou responder à mensagem, mas aqui está o suporte ao jython que você pode aderir antes de desistir:
fonte
Isso pode funcionar para aqueles que usam sistemas operacionais diferentes, mas querem obter o melhor de todos os mundos:
fonte
Você também pode usar "joblib" para esse fim.
Este método fornece o número de cpus no sistema. O joblib precisa ser instalado. Mais informações sobre joblib podem ser encontradas aqui https://pythonhosted.org/joblib/parallel.html
Como alternativa, você pode usar o pacote numexpr de python. Possui muitas funções simples úteis para obter informações sobre a CPU do sistema.
fonte
Outra opção se você não possui o Python 2.6:
fonte