Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableaux

    21 septembre 2019 à 12:56:17

    Bonjour,

    je voulais avoir s'il existait des structures en python similaires aux tableaux en C++ ou en Caml, c'est à dire des listes de taille constante prédéfinie mais qui pemettent une modification/un accès aux éléments peu coûteux.

    Merci bien

    • Partager sur Facebook
    • Partager sur Twitter
      21 septembre 2019 à 14:08:43

      L'accès aux éléments d'une liste en python est en O(1), on peut guère faire mieux...

      Peu coûteux en RAM ? Les array peut-être...

      Sinon un petit travail avec les listes si on veut éviter les surprises lors d'ajouts d'éléments

      class EmptyListError(Exception):
          pass
      
      
      class AppendListError(Exception):
          pass
      
      
      class MyArray(list):
          def __init__(self, max_length=None):
              if not max_length:
                  raise EmptyListError("no possible empty list")
              super().__init__()
              self.max_length = max_length
      
          def append(self, elem):
              if len(self) >= self.max_length:
                  raise AppendListError("Size maximum is {}".format(self.max_length))
              super().append(elem)
      
      
      array = MyArray(max_length=5)
      for i in range(5):
          array.append(i)
      print(array) #  [0, 1, 2, 3, 4]
      
      # array.append(5) #  __main__.AppendListError: Size maximum is 5
      
      array = MyArray() #  __main__.EmptyListError: no possible empty list
      

      en surchargeant la méthode append.

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        21 septembre 2019 à 18:13:39

        Ellister a écrit:

        je voulais avoir s'il existait des structures en python similaires aux tableaux en C++ ou en Caml, c'est à dire des listes de taille constante prédéfinie mais qui pemettent une modification/un accès aux éléments peu coûteux.


        Comme indiqué par fred, la lecture et l'écriture des listes Python sont algorithmiquement efficaces et bien implémentées.  Les listes Python ressemblent beaucoup aux vecteurs de la STL. A ma connaissance les listes fonctionnelles en Caml ne sont pas de taille prédéfinie  (mais on peut faire du Caml non fonctionnel).

        Les tableaux Numpy seront ce qui ressemble le plus à ce que tu évoques mais, sans opération de vectorisation, ils seront souvent moins efficaces que de simples listes Python. Typiquement, à ce que j'ai testé, implémenter un algo de graphe tel que l'algorithme de Floyd-Warshall est 9 fois plus lent avec des tableaux Numpy qu'avec des listes Python et 1,5 fois plus lent avec des array.

        • Partager sur Facebook
        • Partager sur Twitter
          22 septembre 2019 à 18:00:32

          fred1599 a écrit:

          L'accès aux éléments d'une liste en python est en O(1), on peut guère faire mieux...

          Peu coûteux en RAM ? Les array peut-être...

          Sinon un petit travail avec les listes si on veut éviter les surprises lors d'ajouts d'éléments

          class EmptyListError(Exception):
              pass
          
          
          class AppendListError(Exception):
              pass
          
          
          class MyArray(list):
              def __init__(self, max_length=None):
                  if not max_length:
                      raise EmptyListError("no possible empty list")
                  super().__init__()
                  self.max_length = max_length
          
              def append(self, elem):
                  if len(self) >= self.max_length:
                      raise AppendListError("Size maximum is {}".format(self.max_length))
                  super().append(elem)
          
          
          array = MyArray(max_length=5)
          for i in range(5):
              array.append(i)
          print(array) #  [0, 1, 2, 3, 4]
          
          # array.append(5) #  __main__.AppendListError: Size maximum is 5
          
          array = MyArray() #  __main__.EmptyListError: no possible empty list
          

          en surchargeant la méthode append.

          Ok merci de l'info, je pensais que le coût était similaire à celui du Caml ! :)

          Oui je pensais à un truc du type array effectivement, mais finalement le type list de base me parait bien adapté

          PascalOrtiz a écrit:

          Ellister a écrit:

          je voulais avoir s'il existait des structures en python similaires aux tableaux en C++ ou en Caml, c'est à dire des listes de taille constante prédéfinie mais qui pemettent une modification/un accès aux éléments peu coûteux.


          Comme indiqué par fred, la lecture et l'écriture des listes Python sont algorithmiquement efficaces et bien implémentées.  Les listes Python ressemblent beaucoup aux vecteurs de la STL. A ma connaissance les listes fonctionnelles en Caml ne sont pas de taille prédéfinie  (mais on peut faire du Caml non fonctionnel).

          Les tableaux Numpy seront ce qui ressemble le plus à ce que tu évoques mais, sans opération de vectorisation, ils seront souvent moins efficaces que de simples listes Python. Typiquement, à ce que j'ai testé, implémenter un algo de graphe tel que l'algorithme de Floyd-Warshall est 9 fois plus lent avec des tableaux Numpy qu'avec des listes Python et 1,5 fois plus lent avec des array.


          Ah oui bon ben comme dit je vais garder les listes alors

          Euh je sais pas trop je pensais aux array de caml, je me souviens plus trop, j'ai du faire un amalgame avec les listes C++.

          Merci !

          • Partager sur Facebook
          • Partager sur Twitter

          Tableaux

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown