Aproveitando Map() e Compreensões de Listas
Sempre que possível, é preferível utilizar funções, métodos ou funções de biblioteca embutidas em vez de criar algoritmos do zero. Funções embutidas e de biblioteca geralmente são otimizadas para desempenho, executam de forma mais eficiente e são projetadas para lidar com uma ampla variedade de casos extremos de maneira eficaz.
Vamos começar com ferramentas poderosas como a função map() e compreensões de listas, que podem acelerar significativamente seu código. Como as compreensões de listas são mais otimizadas para desempenho e map() é implementada em C, geralmente executam mais rápido do que laços escritos manualmente.
Compreensões de Lista
Compreensões de lista oferecem uma forma mais concisa e frequentemente mais rápida de criar listas em comparação com laços for tradicionais. Além disso, podem tornar seu código mais fácil de ler e entender.
Vamos comparar o desempenho de um laço for e de uma compreensão de lista ao gerar uma lista onde cada número de 1 a 10000000 é multiplicado por 2:
123456789101112131415161718192021import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator numbers = list(range(1, 10000001)) @timeit_decorator(number=3) def list_comprehension(): return [x * 2 for x in numbers] @timeit_decorator(number=3) def for_loop(): result = [] for x in numbers: result.append(x * 2) return result list_1 = list_comprehension() list_2 = for_loop() print(list_1 == list_2)
Usando map()
A função map aplica uma função especificada a cada item em um iterável (por exemplo, uma lista).
Além de ser mais concisa do que escrever laços, geralmente é mais rápida devido às otimizações em nível C em sua implementação, o que reduz a sobrecarga de chamadas de função repetidas.
Embora map possa oferecer alguns benefícios de desempenho, especialmente ao trabalhar com funções embutidas, a diferença de velocidade em relação às compreensões de listas geralmente é insignificante. Ambas são altamente otimizadas e, para operações simples, a vantagem de desempenho do map é quase imperceptível. Na prática, a escolha entre as duas deve ser baseada mais na legibilidade e em casos de uso específicos, como eficiência de memória com map.
Vamos comparar o desempenho de map, laços for e compreensões de listas ao formatar 1000000 nomes de clientes para o formato title case (por exemplo, 'john doe' -> 'John Doe'):
1234567891011121314151617181920212223242526import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator customer_names = ['john doe', 'jane smith', 'alex johnson', 'ivan smith'] * 250000 @timeit_decorator(number=10) def map_function(): return list(map(str.title, customer_names)) @timeit_decorator(number=10) def list_comprehension(): return [name.title() for name in customer_names] @timeit_decorator(number=10) def for_loop(): result = [] for name in customer_names: result.append(name.title()) return result formatted_with_map = map_function() formatted_with_comprehension = list_comprehension() formatted_with_for_loop = for_loop() print(formatted_with_map == formatted_with_comprehension == formatted_with_for_loop)
Como esperado, o loop for é a abordagem mais lenta das três. Neste exemplo, map mostrou-se mais rápido do que a compreensão de listas, embora, na prática, o desempenho possa variar dependendo do caso de uso específico. Às vezes, compreensões de listas podem até superar o map, especialmente para expressões mais simples.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 7.69
Aproveitando Map() e Compreensões de Listas
Deslize para mostrar o menu
Sempre que possível, é preferível utilizar funções, métodos ou funções de biblioteca embutidas em vez de criar algoritmos do zero. Funções embutidas e de biblioteca geralmente são otimizadas para desempenho, executam de forma mais eficiente e são projetadas para lidar com uma ampla variedade de casos extremos de maneira eficaz.
Vamos começar com ferramentas poderosas como a função map() e compreensões de listas, que podem acelerar significativamente seu código. Como as compreensões de listas são mais otimizadas para desempenho e map() é implementada em C, geralmente executam mais rápido do que laços escritos manualmente.
Compreensões de Lista
Compreensões de lista oferecem uma forma mais concisa e frequentemente mais rápida de criar listas em comparação com laços for tradicionais. Além disso, podem tornar seu código mais fácil de ler e entender.
Vamos comparar o desempenho de um laço for e de uma compreensão de lista ao gerar uma lista onde cada número de 1 a 10000000 é multiplicado por 2:
123456789101112131415161718192021import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator numbers = list(range(1, 10000001)) @timeit_decorator(number=3) def list_comprehension(): return [x * 2 for x in numbers] @timeit_decorator(number=3) def for_loop(): result = [] for x in numbers: result.append(x * 2) return result list_1 = list_comprehension() list_2 = for_loop() print(list_1 == list_2)
Usando map()
A função map aplica uma função especificada a cada item em um iterável (por exemplo, uma lista).
Além de ser mais concisa do que escrever laços, geralmente é mais rápida devido às otimizações em nível C em sua implementação, o que reduz a sobrecarga de chamadas de função repetidas.
Embora map possa oferecer alguns benefícios de desempenho, especialmente ao trabalhar com funções embutidas, a diferença de velocidade em relação às compreensões de listas geralmente é insignificante. Ambas são altamente otimizadas e, para operações simples, a vantagem de desempenho do map é quase imperceptível. Na prática, a escolha entre as duas deve ser baseada mais na legibilidade e em casos de uso específicos, como eficiência de memória com map.
Vamos comparar o desempenho de map, laços for e compreensões de listas ao formatar 1000000 nomes de clientes para o formato title case (por exemplo, 'john doe' -> 'John Doe'):
1234567891011121314151617181920212223242526import os os.system('wget https://staging-content-media-cdn.codefinity.com/courses/8d21890f-d960-4129-bc88-096e24211d53/section_1/chapter_3/decorators.py 2>/dev/null') from decorators import timeit_decorator customer_names = ['john doe', 'jane smith', 'alex johnson', 'ivan smith'] * 250000 @timeit_decorator(number=10) def map_function(): return list(map(str.title, customer_names)) @timeit_decorator(number=10) def list_comprehension(): return [name.title() for name in customer_names] @timeit_decorator(number=10) def for_loop(): result = [] for name in customer_names: result.append(name.title()) return result formatted_with_map = map_function() formatted_with_comprehension = list_comprehension() formatted_with_for_loop = for_loop() print(formatted_with_map == formatted_with_comprehension == formatted_with_for_loop)
Como esperado, o loop for é a abordagem mais lenta das três. Neste exemplo, map mostrou-se mais rápido do que a compreensão de listas, embora, na prática, o desempenho possa variar dependendo do caso de uso específico. Às vezes, compreensões de listas podem até superar o map, especialmente para expressões mais simples.
Obrigado pelo seu feedback!