Boutique Cinema 4D
Affichage des résultats 1 à 8 sur 8

Discussion: Optimisation en Python

  1. #1
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483

    Optimisation en Python

    Bonjour,

    Ce sujet a pour but de regrouper les petites astuces permettant d'augmenter la vitesse d'exécution d'un code Python.


    Exemple de chronomètre :
    Code PHP:
    import time
    import c4d

    def chrono
    ():
        
    time.time()
        
        for 
    i in xrange(10000000) :
            
    pass
        
        
    print time.time() - t

    if __name__=='__main__':
        
    chrono() 
    --


    Vérifier un booléen :

    Code PHP:
    if a is True 
    ██████████ 0,70 s

    Code PHP:
    if 

    █████
    0,35 s - Gain de 50 %


    --


    Boucle :

    Code PHP:
    for i in range(10000000) : 
    ██████████ 0,84 s

    Code PHP:
    for i in xrange(10000000) : 
    ███ 0,24 s - Gain de 71 %

  2. #2
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Je découvre des choses intéressantes, si quelqu'un a une explication, elle est la bienvenue :

    Créer un vecteur :

    Code PHP:
    c4d.Vector(000
    ██████████ 4,25 s

    Code PHP:
    c4d.Vector(0.00.00.0
    █████████ 3,86 s - Gain de 10 %

    Code PHP:
    c4d.Vector() 
    ████ 2,60 s - Gain de 39 %


    Il en va de même pour créer un vecteur quelconque ayant les trois mêmes valeurs, Vector(1.0) sera plus rapide que Vector(1.0, 1.0, 1.0) et Vector(1, 1, 1).


    Ma théorie :
    Dans le premier cas, j'imagine que Python doit convertir les entiers en flottants, ce qui rend le second cas plus rapide étant donné qu'on entre flottants directement, et le dernier cas n'a probablement pas à vérifier les valeurs entrées, d'où le gain.
    Dernière modification par César Vonc ; 17/09/2012 à 17h58.

  3. #3
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Salut,

    Super sujet César.

    Voilà un petit bout de code pour comparer le temps d'execution de 2 instructions :

    Code PHP:
    import timeit
    import c4d

    LOOP_COUNT 
    10000000

    def compare
    (stmt1stmt2):
        
    t1 timeit.Timer(stmt1"import c4d").timeit(number=LOOP_COUNT)
        
    t2 timeit.Timer(stmt2"import c4d").timeit(number=LOOP_COUNT)
        print 
    "Statement 1 : %.3f s" t1
        
    print "Statement 2 : %.3f s" t2
        faster 
    if t1 t2 else 2
        
    if faster == 2:
            
    t1t2 t2t1
        diff 
    t2 t1
        percent 
    100.0 t1 t2 100.0
        
    print "-> Statement %d is %.3f s (%.1f %%) faster" % (fasterdiffpercent)


    test1 """
        a = 42
        if a & 1:
            pass
    """

    test2 """
        a = 42
        if a % 2:
            pass
    """

    def main():
        
    compare(test1test2
    Pour le c4d.Vector, je pense que tu as raison, la conversion implicite prend du temps. Cela se vérifie en comparant :
    Code PHP:
        a 1.0
        a 
    += 1.0 
    plus rapide (~ 10 %) que
    Code PHP:
        a 1.0
        a 
    += 
    Aussi
    Code PHP:

    plus rapide (~ 14 %) que
    Code PHP:
    abxy
    et de ce fait "c4d.Vector(1)" sera quand même plus rapide que "c4d.Vector(1.0, 1.0, 1.0)" mais moins que "c4d.Vector(1.0)"

  4. #4
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Attention certains exemples sont destinés à être utilisés uniquement dans le cas d'un problème de rapidité avéré.

    Tester la nullité d'un entier :

    Code PHP:
    if == 
    ██████████ 6,04 s

    Code PHP:
    if not a 
    █████████ 5,38 s - Gain de 11 %


    --


    Tester la positivité d'un index inférieur :

    Code PHP:
    if 0
    ██████████ 0,80 s

    Code PHP:
    if 1
    ████████ 0,60 s - Gain de 25 %


    --


    Insérer dans un tableau :

    Code PHP:
    tab = []
    for 
    i in xrange(5):
        
    tab.append(i
    ██████████ 1,44 s

    Code PHP:
    tab = []
    append tab.append
    for i in xrange(5):     
        
    append(i
    █████████ 1,22 s - Gain de 15 %


    --


    Opérations sur les vecteurs :

    Code PHP:
    c4d.Vector(102030)
    c4d.Vector(123)
    c4d.Vector(v.w.xv.w.yv.w.z)
    c4d.Vector(v.w.xv.w.yv.w.z
    ██████████ 2,75 s

    Code PHP:
    c4d.Vector(102030)
    c4d.Vector(123)
    w

    ████ 0,99 s - Gain de 64 %



    --


    Tester si le tableau contient au moins 1 élément :

    Code PHP:
    = []
    if 
    len(a) == 0
    ██████████ 1,52 s

    Code PHP:
    = []
    if 
    not a
    █████ 0,76 s - Gain de 50 %
    Dernière modification par xs_yann ; 26/09/2012 à 17h37.

  5. #5
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Excellent, Yann !

    Dis donc, je connaissais pas cette formulation :
    Code PHP:
    tab = [] 
    append tab.append 
    for i in xrange(5):      
        
    append(i
    C'est plutôt curieux, append a quel type ?

  6. #6
    Pilier Avatar de xs_yann
    Date d'inscription
    février 2005
    C4D version
    R19 Studio
    OS
    Mac OS X 10.13
    Messages
    1 990
    Citation Envoyé par console python
    >>> tab = []
    >>> append = tab.append
    >>> type(append)
    <type 'builtin_function_or_method'>
    C'est le même principe que les pointeurs sur fonctions en C++.

    Deux liens en anglais avec pleins de conseils :

    http://wiki.python.org/moin/PythonSpeed/PerformanceTips
    http://stackoverflow.com/questions/7...ng-python-code

  7. #7
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Merci pour les liens.


    Division de flottants
    :

    Code PHP:
    5.0 
    ██████████ 1,00 s

    Code PHP:
    5.0 2.0 
    ████████ 0,80 s - Gain de 20 %

    Code PHP:
    5.0 0.5 
    ████ 0,36 s - Gain de 64 %


    Préférer la multiplication plutôt que la division tant que possible.
    Remplacer 1/3 par 0,333 est préférable si la précision n'est pas de mise.

    Note : 5 / 2 renverra un nombre entier (2).
    Dernière modification par César Vonc ; 29/09/2012 à 18h38.

  8. #8
    Gourou Avatar de César Vonc
    Date d'inscription
    avril 2006
    C4D version
    Autre
    OS
    Windows 10
    Messages
    2 483
    Édit : finalement tout ça était faux, il faut mieux rester avec des vecteurs tout le temps car la conversion de vecteurs en tuples est beaucoup trop longue.
    Dernière modification par César Vonc ; 27/01/2014 à 12h06.

Discussions similaires

  1. Optimisation GI
    Par Toche dans le forum Rendu
    Réponses: 5
    Dernier message: 07/05/2010, 09h56
  2. Optimisation
    Par Tacos dans le forum Nouveaux membres
    Réponses: 12
    Dernier message: 02/09/2009, 03h02
  3. Spline Optimisation?
    Par NiKo dans le forum Plugins
    Réponses: 17
    Dernier message: 27/04/2009, 17h22
  4. optimisation d'exportation
    Par Nathy dans le forum Général Cinema 4D
    Réponses: 2
    Dernier message: 17/07/2005, 16h46
  5. Optimisation posemixer
    Par Fluffy dans le forum Plugins
    Réponses: 5
    Dernier message: 11/03/2005, 09h40

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •  
Mediaworks - Logiciels 3D | Design Internet - Creation site internet