Script tournant bien sur Linux Cpu i3. mais pas sur W10 Cpu i7. Quelle solution?

Signaler
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
-
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
-
Bonjour,

j'utilise un petit script avec des fonctions "process" pour streesser tous les Cpu d'une machine.
Le script ne fonctionne pas sur un i7 sous Windows.
Quel modif apporter a ce script pour reussir a le faire tourner sous windows ?
Merci !!

code joint et rapport du bug :

from multiprocessing import Process
import os
import math
import time

depart = time.perf_counter()

# 40 sec pour 100M de fois

def calc():
	for i in range(0, 1000):
			i = i + 123456789
			i = i * 123456789
			i = i / 1.3333

processes = []

for i in range(os.cpu_count()):
	print('registering PROCESS %d' % i)
	processes.append(Process(target=calc))

for process in processes:
	process.start()

for process in processes:
	process.join()

final = time.perf_counter()
    # Print results
print()
print(f'PROCESS Estimate is {round(final-depart,4)} seconds(s)')



Bug repport :

registering PROCESS 1
registering PROCESS 2
registering PROCESS 3
registering PROCESS 4
registering PROCESS 5
registering PROCESS 6
registering PROCESS 7
registering PROCESS 0
registering PROCESS 1
Traceback (most recent call last):
registering PROCESS 2
File "<string>", line 1, in <module>
registering PROCESS 3
registering PROCESS 4
registering PROCESS 5
registering PROCESS 6
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 116, in spawn_main
registering PROCESS 7
exitcode = _main(fd, parent_sentinel)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 125, in _main
Traceback (most recent call last):
File "<string>", line 1, in <module>
prepare(preparation_data)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 236, in prepare
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 116, in spawn_main
exitcode = _main(fd, parent_sentinel)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 125, in _main
prepare(preparation_data)
_fixup_main_from_path(data['init_main_from_path'])
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 236, in prepare
main_content = runpy.run_path(main_path,
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 265, in run_path
_fixup_main_from_path(data['init_main_from_path'])
return _run_module_code(code, init_globals, run_name,
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 97, in _run_module_code
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 287, in _fixup_main_from_path
_run_code(code, mod_globals, init_globals,
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 87, in _run_code
exec(code, run_globals)
File "C:\Users\Terence\Desktop\enge-processes.py", line 27, in <module>
process.start()
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\context.py", line 327, in _Popen
registering PROCESS 0
registering PROCESS 1
registering PROCESS 2
registering PROCESS 3
registering PROCESS 4
registering PROCESS 5
registering PROCESS 6
registering PROCESS 7
return Popen(process_obj)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\popen_spawn_win32.py", line 45, in __init__
main_content = runpy.run_path(main_path,
Traceback (most recent call last):
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 265, in run_path
prep_data = spawn.get_preparation_data(process_obj._name)
File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.1776.0_x64__qbz5n2kfra8p0\lib\multiprocessing\spawn.py", line 154, in get_prepara



Configuration: Linux / Chrome 84.0.4147.105

9 réponses

Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
bonjour,
as-tu écrit ce code?
dans quel contexte fais-tu cela?
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

au fait - avec un range de 1.000.000, le code retroune quel temps en seconde sur ta machine ?
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

0.7127 seconds(s)
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

je l ai adapté, c'est pour comparer la vitesse de calcul sur des milliers de loops d'une machine a une autre. Choix d achat d'une machine...traitement de calcul sur de grande liste d enregistrement. pourquoi la question ?
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
pour t'aider au mieux.
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
ceci fonctionne mieux chez moi:
from multiprocessing import Process
import os
import math
import time
def calc():
    for i in range(0, 1000):
            i = i + 123456789
            i = i * 123456789
            i = i / 1.3333
if __name__ == '__main__':
    depart = time.perf_counter()
    processes = []
    for i in range(os.cpu_count()):
        print('registering PROCESS %d' % i)
        processes.append(Process(target=calc))
    for process in processes:
        process.start()
    for process in processes:
        process.join()
    final = time.perf_counter()
        # Print results
    print(f'PROCESS Estimate is {round(final-depart,4)} seconds(s)')
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

il y a eu beaucoup de versions du script, je ne sais pas donc si ton calcul est correct.
en voyant les chiffres, j'aurais tendance à suspecter que le calcul n'est pas correct.
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

as-tu essayé ceci:
from multiprocessing import Process
import os
import math
import time
loops=5*10**6
def calc():
    for i in range(0, loops):
            i = i + 123456789
            i = i * 123456789
            i = i / 1.3333
if __name__ == '__main__':
    for pc in range(1,os.cpu_count()+5):
        depart = time.perf_counter()
        processes = []
        for i in range(pc):
            #print('registering PROCESS %d' % i)
            processes.append(Process(target=calc))
        for process in processes:
            process.start()
        for process in processes:
            process.join()
        final = time.perf_counter()
            # Print results
        mlps=round(pc*loops/(final-depart)/10**6,1)
        print(f'{round(final-depart,4)} seconds(s) with {pc} processes each doing {loops} loops : {mlps} Mloop/s')
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
>
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

oui, je pense..
ne trouvant pas ...je suis repassé a la version GO,
et la !! "flash ben-oui !!... il suffirait de rajouter une division manquante sur le calcul estimée du temps pour que cela "colle" :) donc .... elapsed := time.Since(start) / (4) << nombre de core utilisés - nechpas ?!!
(enfin j imagine que cela viendrait de la...)
je retoucherais le script sous python - mais sa lenteur intrinseque me pousse a continuer sous Go *je crois comprendre que Cython serait pas mal rapide mais pas vraiment mis a jour....
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

il ne s'agit pas du nombre de cores utilisés, mais du nombre de processus.
au lieu de diviser le temps par le nombre de processus, qui produit une valeur qui n'a aucune signification, il est peut-être plus approprié, si ce n'est déjà fait, de compter le nombre total de loops, pas le nombre de loops pas processus.
si tu calculais en loops/secondes, ce serait beaucoup plus clair.
si tu veux être conseillé, partage ton code.
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
>
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

le nombre de loops par seconde ne donne qu'une reference scientifique très abstraite.
Le nombre de processus maxi, ne m intéresse pas non plus - rajouter plus de process que de Core, n'accelerera pas un traitement global qui dépend du hardware /Os... donc c'est le nombre de Core physique que je cible.
Savoir que 100.000 enregistrements sont "traitable" par un i3, 1 Core en 4 sec ou en 1 sec par 4 cores,...la... ca me parle de suite. (c 'est ce qui est prevu par la suite, après cette simulation de calcul-en-memoire)
- j' obtient une bonne indication de taille et de temps.
- je peut la comparer avec la même opération sur un i5, i7, etc...
au jour le jour je pense qu'on travaille tous avec des listes (...mais pas avec des loops)
Donc un Bench qui me sortira la vitesse en loops, ca sera joli dans un tableau général mais ça n'aidera personne avec un résultats directement exploitables, lacune que ce BM se donne l'objectif de combler :)

PS: Le code, na pas changé, c est tjrs celui que tu m' avais envoyé la dernière fois. 1Core/4 Core (ou 1&4 process)
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

Alors, c est intéressant mais les temps que j obtient sont moindres (du a Linux je suppose.)

Questions :
ta machine est-ELLE sous Windows10 ? (pas de bug lors du test alors)
Quel est le Modele de son CPU/Freq/core ?

ici sur un i3 /8Gb Ram j'obient pour...
1M/0.5852
100M/39.8392 (...61.0476 sec /PC Celeron)
550M/210.5996 sec
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
W10, i7, 6 cores, 12 logical processors, de 3 à 3.9 GHz pendant les tests

il y a 6 cores, et os.cpu_count donne 12, le nombre de logical processors

PROCESS Estimate is 2.3616 seconds(s) for 10000000 loops with 1 processes
PROCESS Estimate is 2.6499 seconds(s) for 10000000 loops with 2 processes
PROCESS Estimate is 2.5299 seconds(s) for 10000000 loops with 3 processes
PROCESS Estimate is 2.4333 seconds(s) for 10000000 loops with 4 processes
PROCESS Estimate is 2.5475 seconds(s) for 10000000 loops with 5 processes
PROCESS Estimate is 2.8449 seconds(s) for 10000000 loops with 6 processes
PROCESS Estimate is 3.1563 seconds(s) for 10000000 loops with 7 processes
PROCESS Estimate is 3.612 seconds(s) for 10000000 loops with 8 processes
PROCESS Estimate is 4.0656 seconds(s) for 10000000 loops with 9 processes
PROCESS Estimate is 4.6616 seconds(s) for 10000000 loops with 10 processes
PROCESS Estimate is 5.0652 seconds(s) for 10000000 loops with 11 processes
PROCESS Estimate is 5.5817 seconds(s) for 10000000 loops with 12 processes
PROCESS Estimate is 6.6134 seconds(s) for 10000000 loops with 13 processes
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

Ok, le collegue a un i7 aussi, mais chez lui ca plante...
ah, mais il a 4 core/8threads. 4ghz
(et peut etre overclockee) :)

i3 : 10M / 3.9559 sec !
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

bizarre, moi j'ai éliminé cette erreur avec le code en #6.
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
>
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

comment ça éliminé l'erreur ?
tu as apporté une modif a ce script; si oui, ,laquelle ?
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

tu n'as pas lu ma réponse #6?
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
les processeurs sont devenus plus performants parce qu'ils font plus rapidement des opérations plus complexes.
si tu ne fais que des opérations si simples, tu n'as peut-être pas besoin de processeur performant.
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
4 cores/8 threads: teste avec 4 process, pas 8!
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
en fait, si tu veux comparer les performances des ordis, tu as intérêt à compter le nombre de boucles par seconde:
2.3883 seconds(s) for 10000000 loops with 1 processes: 4.2 Mloop/s
2.3668 seconds(s) for 10000000 loops with 2 processes: 8.5 Mloop/s
2.4471 seconds(s) for 10000000 loops with 3 processes: 12.3 Mloop/s
2.493 seconds(s) for 10000000 loops with 4 processes: 16.0 Mloop/s
2.9246 seconds(s) for 10000000 loops with 5 processes: 17.1 Mloop/s
2.7775 seconds(s) for 10000000 loops with 6 processes: 21.6 Mloop/s
3.2584 seconds(s) for 10000000 loops with 7 processes: 21.5 Mloop/s
3.6383 seconds(s) for 10000000 loops with 8 processes: 22.0 Mloop/s
4.1269 seconds(s) for 10000000 loops with 9 processes: 21.8 Mloop/s
4.5336 seconds(s) for 10000000 loops with 10 processes: 22.1 Mloop/s
5.0396 seconds(s) for 10000000 loops with 11 processes: 21.8 Mloop/s
5.6006 seconds(s) for 10000000 loops with 12 processes: 21.4 Mloop/s
6.4755 seconds(s) for 10000000 loops with 13 processes: 20.1 Mloop/s
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

comment tu obtient les Loops.Sec. ? dans ma fenêtre...il ne met que :
registering PROCESS 0
registering PROCESS 1
registering PROCESS 2
registering PROCESS 3
PROCESS Estimate is 1.4697 seconds(s
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

tu peux toujours poser la question dans le forum "programmation" (à propos du Golang). ce n'est pas parce qu'il n'y a pas de forum dédié que personne ne peux aider.
qui sait, tu susciteras peut-être des vocations...
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
>
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

Merci pour la suggestion...j'irais tt de même voir déjà s'il y aurais qq forum avec un maxi d utilisateurs
...commencer tt seul c'est pas très folichon comme projet surtout avec mon niveau :) :) !
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
>
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

Recherche, volontaire...possedant au moins 1 an de Python...et desireux d'aller plus vite !
Ahahaha :)
Au fait, tu aurais teste Julia aussi ?
https://forums.commentcamarche.net/forum/affich-36883766-y-a-t-il-des-goland-ais-dans-l-avion
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

je n'ai encore découvert ni Go, ni Julia.
c'est probablement à partir de questions concrètes que certains se lanceront dans ces divers langages, comme j'ai fait pour Python.
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
>
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

je me pose la question a savoir s'il est "intéressant" et pour moi...et pour d'autre de mettre un script python sur une page Github...l'as tu déjà fait ? en cas de partage les autres s'attendent-il a ce que le code soit parfait....quel est l’intérêt si ce n'est que d'en faire une backup ?
merci pour toute info
Messages postés
119
Date d'inscription
mardi 11 décembre 2018
Statut
Membre
Dernière intervention
9 octobre 2020
8
salut utilises CPUStressMT, il t'offre meme le pourcentage de stresse
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020

Ahhh !!!! :)
c est pas dans mon script ca :) !
... ca ne m'intéresse pas ces benchmarks, je connais...
Ils font appel a des calcul sur des formules dont on a aucune utilitée en général, Fibonaci et compagnie...PRRrtttt, c est pas mon pain quotidien - !!
Ce qui m'importe c'est de comparer des opérations précises que j'utiliserais vraiment sur des fichiers ou des bases de données dont je connais la taille de X enregistrement et avec des opérations genre comptabilité ou de modif de contenu soit... division, multiplication ou concaténation bref...du concret de tout les jours... pas des benchmark de Geek sur des calculs de trucs improbables !
...même s'il devrait y avoir surement une corrélations d'une manière ou d'une autre (...ça reste a démontrer)
C'est comme les fameux benchmark des moteurs de VW sensés polluer moins ...en Labo...jusqu'a ce qu'on vérifie ...en conditions réelles tout cela, n'est-ce pas ? :)
:)
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
attention, faire des opérations sur une seule variable, cela n'est pas la même chose que de faire des opérations sur un ensemble d'enregistrements!
Messages postés
21
Date d'inscription
jeudi 8 octobre 2020
Statut
Membre
Dernière intervention
23 octobre 2020
>
Messages postés
12725
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

oui, tout a fait, je comprend...
l utilisation d une valeur "i" ici est arbitraire, de même que la multiplication/adition/division, etc.

Dans un cas réel :
- chaque ligne ferait très certainement appel a plusieurs valeurs distinctes non-répétitives, et quelques opération etc...
- Au moins 1 chargement de données en mémoire (fichier ou db)
- + oper lecture/écriture...

. Pour le moment, c 'est une simulation d’opération de calcul mais effectivement on pourra rendre le test vraiment réaliste par la suite en joignant un/des fichier/s texte/db de plusieurs millier/millions de lignes... par la suite et en lui appliquant diverses opérations type.
...c'est envisagé :)