835 Stimmen

Wie man die Anzahl der CPUs mit Python herausfindet

Ich möchte die Anzahl der CPUs auf dem lokalen Rechner unter Verwendung von Python herausfinden. Das Ergebnis sollte user/real sein, wie es von time(1) ausgegeben wird, wenn es mit einem optimal skalierenden Benutzerbereichs-Programm aufgerufen wird.

0 Stimmen

Wenn Sie Torch verwenden, können Sie import torch.multiprocessing; mp.cpu_count() ausführen.

7 Stimmen

Du solltest cpusets (in Linux) im Kopf behalten. Wenn du in einem cpuset bist, geben die unten stehenden Lösungen immer noch die Anzahl der echten CPUs im System an, nicht die Anzahl, die deinem Prozess zur Verfügung steht. /proc//status hat einige Zeilen, die dir die Anzahl der CPUs im aktuellen cpuset anzeigen: Suche nach Cpus_allowed_list.

64voto

Davoud Taghawi-Nejad Punkte 14966

Wenn Sie die Anzahl der physischen Kerne (nicht virtuelle hyperthreaded Kerne) wissen möchten, hier ist eine plattformunabhängige Lösung:

psutil.cpu_count(logical=False)

https://github.com/giampaolo/psutil/blob/master/INSTALL.rst

Beachten Sie, dass der Standardwert für logical True ist, also wenn Sie hyperthreaded Kerne einschließen möchten, können Sie folgendes verwenden:

psutil.cpu_count()

Dies wird die gleiche Anzahl liefern wie os.cpu_count() und multiprocessing.cpu_count(), bei denen keiner über das Schlüsselwortargument logical verfügt.

9 Stimmen

Was ist der Unterschied zwischen einer logischen CPU und einer nicht-logischen CPU auf meinem Laptop: psutil.cpu_count(logical=False) #4 psutil.cpu_count(logical=True) #8 und multiprocessing.cpu_count() #8

6 Stimmen

@user305883 Angenommen, Sie haben eine x86-CPU, haben Sie Hyperthreading auf diesem Gerät, d.h. jedem physischen Kern entsprechen zwei Hyperthreads ('logische' Kerne). Hyperthreading ermöglicht es dem physischen Kern, verwendet zu werden, um Anweisungen von Thread B auszuführen, wenn Teile davon für Thread A inaktiv sind (z.B. beim Warten auf Daten, die aus dem Cache oder dem Arbeitsspeicher abgerufen werden). Abhängig von Ihrem Code kann man eine oder einige zehn Prozent zusätzliche Kernnutzung erreichen, liegt aber weit unter der Leistung eines echten physischen Kerns.

1 Stimmen

Mit Abstand die beste Antwort, aber sie ist sehr schwer zu finden unter all den anderen.

32voto

yangliu2 Punkte 291

Diese geben Ihnen die Anzahl der CPU-Kerne mit Hyperthreading

  1. multiprocessing.cpu_count()
  2. os.cpu_count()

Diese geben Ihnen die Anzahl der virtuellen Maschinen-CPU-Kerne

  1. psutil.cpu_count()
  2. numexpr.detect_number_of_cores()

Nur relevant, wenn Sie mit VMs arbeiten.

0 Stimmen

Nicht wirklich. Wie bereits erwähnt, wird os.cpu_count() und multiprocessing.cpu_count() die Anzahl der Hyperthreaded CPUs zurückgeben, nicht die tatsächliche Anzahl der physischen CPUs.

2 Stimmen

Ja. Ich habe es umformuliert. Typischerweise ist es Anzahl der Kerne x 2. Was ich meine ist, wenn Sie auf einer virtuellen Maschine sind, die 8 Kerne zugewiesen bekommen hat, aber Ihre Host-Maschine physisch 20 Kerne hat, gibt Ihnen der erste Befehlssatz 20 und der zweite Befehlssatz 8.

28voto

Jabir Ali Punkte 332

Für Python-Versionen über 3.4 können Sie verwenden

import os
os.cpu_count()

Wenn Sie nach einem Äquivalent des Linux-Befehls nproc suchen. Sie haben diese Option

len(os.sched_getaffinity(0))

22voto

Douglas B. Staple Punkte 9842

multiprocessing.cpu_count() gibt die Anzahl der logischen CPUs zurück, also wenn Sie eine Quad-Core-CPU mit Hyper-Threading haben, wird es 8 zurückgeben. Wenn Sie die Anzahl der physischen CPUs möchten, verwenden Sie die Python-Bindungen zu hwloc:

#!/usr/bin/env python
import hwloc
topology = hwloc.Topology()
topology.load()
print topology.get_nbobjs_by_type(hwloc.OBJ_CORE)

hwloc ist darauf ausgelegt, über verschiedene Betriebssysteme und Architekturen portabel zu sein.

0 Stimmen

In diesem Fall möchte ich die Anzahl der logischen CPUs wissen (d. h. wie viele Threads sollte ich starten, wenn dieses Programm wirklich gut skaliert), aber die Antwort könnte dennoch hilfreich sein.

9 Stimmen

Oder psutil.cpu_count(logical=False)

14voto

Konchog Punkte 1651

Dies könnte für diejenigen von uns funktionieren, die verschiedene Betriebssysteme verwenden, aber das Beste aus allen Welten herausholen möchten:

import os
workers = os.cpu_count()
if 'sched_getaffinity' in dir(os):
    workers = len(os.sched_getaffinity(0))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X