Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

148
Views
¿Debo evitar convertir a una cadena si un valor ya es una cadena?

A veces, debe usar la comprensión de listas para convertir todo en cadenas, incluidas las propias cadenas.

 b = [str(a) for a in l]

Pero tengo que hacer:

 b = [a if type(a)==str else str(a) for a in l]

Me preguntaba si str en una cadena está lo suficientemente optimizado como para no crear otra copia de la cadena.

Yo he tratado:

 >>> x="aaaaaa" >>> str(x) is x True

pero eso puede deberse a que Python puede almacenar cadenas en caché y las reutiliza. Pero, ¿ese comportamiento está garantizado para cualquier valor de una cadena?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Probar si un objeto ya es una cadena es más lento que simplemente convertirlo siempre en una cadena.

Eso es porque el método str() también hace exactamente la misma prueba (el objeto ya es una cadena). Estás a) haciendo el doble de trabajo, yb) tu prueba es más lenta para arrancar.

Nota: para Python 2, el uso de str() en objetos unicode incluye una codificación implícita en ASCII, y esto puede fallar. Es posible que aún tenga que manejar casos especiales de dichos objetos. En Python 3, no hay necesidad de preocuparse por ese caso extremo.

Como hay cierta discusión sobre esto:

  • isinstance(s, str) tiene un significado diferente cuando s puede ser una subclase de str . Como las subclases son tratadas exactamente como cualquier otro tipo de objeto por str() (se llama __str__ o __repr__ en el objeto), esta diferencia es importante aquí.
  • Debe usar type(s) is str para verificaciones de tipos exactos. Los tipos son singletons, aprovecha esto, is más rápido:

     >>> import timeit >>> timeit.timeit("type(s) is str", "s = ''") 0.10074466899823165 >>> timeit.timeit("type(s) == str", "s = ''") 0.1110201120027341
  • Usar s if type(s) is str else str(s) es significativamente más lento para el caso que no es una cadena :

     >>> import timeit >>> timeit.timeit("str(s)", "s = None") 0.1823573520014179 >>> timeit.timeit("s if type(s) is str else str(s)", "s = None") 0.29589492800005246 >>> timeit.timeit("str(s)", "s = ''") 0.11716728399915155 >>> timeit.timeit("s if type(s) is str else str(s)", "s = ''") 0.12032335300318664

    (Los tiempos para los casos s = '' están muy cerca y siguen cambiando de lugar).

Todos los tiempos en esta publicación se realizaron en Python 3.6.0 en una Macbook Pro 15" (mediados de 2015), OS X 10.12.3.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!