Capítulo 11: De la Teoría a la Práctica. Estudios de Caso y Optimizaciones
Ejercicios Prácticos para el Capítulo 11
Los siguientes ejercicios brindan oportunidades prácticas para profundizar y mejorar el código Python para obtener un rendimiento y eficiencia superiores. Cubren una variedad de situaciones, que incluyen el refinamiento de algoritmos de ordenación, la gestión de conjuntos de datos extensos y la aplicación de técnicas de procesamiento paralelo. Estos ejercicios están diseñados para reflejar desafíos de codificación reales que puede encontrar.
Ejercicio 1: Optimización de una Función de Ordenación
- Objetivo: Mejorar el rendimiento de una función de ordenación de Python.
- Tarea: Implementar una función de ordenación personalizada y luego optimizarla utilizando funcionalidades integradas de Python.
Solución:
# Initial Custom Sorting Function
def custom_sort(arr):
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] > arr[j]:
arr[i], arr[j] = arr[j], arr[i]
return arr
# Optimized Sorting Using Built-in Sort
def optimized_sort(arr):
return sorted(arr)
# Example Usage
arr = [3, 1, 4, 1, 5, 9, 2, 6]
print("Custom Sort:", custom_sort(arr.copy()))
print("Optimized Sort:", optimized_sort(arr.copy()))
Ejercicio 2: Optimización de Memoria en el Procesamiento de Datos
- Objetivo: Optimizar una función de Python para el uso de memoria.
- Tarea: Reescribir una función que procesa un conjunto de datos grande para que sea más eficiente en cuanto a memoria utilizando generadores.
Solución:
# Initial Memory-Intensive Function
def process_data(data):
results = []
for item in data:
results.append(item * 2) # Some processing
return results
# Memory-Optimized Function Using Generators
def optimized_process_data(data):
for item in data:
yield item * 2
# Example Usage
large_data = range(1000000)
print("Memory-Optimized Processing:")
for result in optimized_process_data(large_data):
pass # Replace with actual use of 'result'
Ejercicio 3: Paralelización de una Tarea Intensiva en Cómputo
- Objetivo: Utilizar el multiprocesamiento de Python para optimizar una tarea intensiva en cómputo.
- Tarea: Modificar una función que realiza una operación ligada a la CPU para que utilice múltiples núcleos.
Solución:
from multiprocessing import Pool
def compute_square(n):
return n * n
def parallel_square(numbers):
with Pool(4) as pool:
return pool.map(compute_square, numbers)
# Example Usage
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Parallel Square Computation:", parallel_square(numbers))
Ejercicio 4: Perfilado y Optimización de Código en Python
- Objetivo: Perfilar un script de Python e identificar cuellos de botella.
- Tarea: Utilizar
cProfile
para perfilar la función proporcionada y luego optimizarla.
Función Inicial:
def find_primes(n):
primes = []
for num in range(2, n + 1):
prime = True
for i in range(2, num):
if (num % i) == 0:
prime = False
break
if prime:
primes.append(num)
return primes
# Profiling
import cProfile
cProfile.run('find_primes(1000)')
Función Optimizada:
def optimized_find_primes(n):
primes = []
for num in range(2, n + 1):
if all(num % i != 0 for i in range(2, int(num**0.5) + 1)):
primes.append(num)
return primes
# Example Usage and Profiling
cProfile.run('optimized_find_primes(1000)')
Ejercicios Prácticos para el Capítulo 11
Los siguientes ejercicios brindan oportunidades prácticas para profundizar y mejorar el código Python para obtener un rendimiento y eficiencia superiores. Cubren una variedad de situaciones, que incluyen el refinamiento de algoritmos de ordenación, la gestión de conjuntos de datos extensos y la aplicación de técnicas de procesamiento paralelo. Estos ejercicios están diseñados para reflejar desafíos de codificación reales que puede encontrar.
Ejercicio 1: Optimización de una Función de Ordenación
- Objetivo: Mejorar el rendimiento de una función de ordenación de Python.
- Tarea: Implementar una función de ordenación personalizada y luego optimizarla utilizando funcionalidades integradas de Python.
Solución:
# Initial Custom Sorting Function
def custom_sort(arr):
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] > arr[j]:
arr[i], arr[j] = arr[j], arr[i]
return arr
# Optimized Sorting Using Built-in Sort
def optimized_sort(arr):
return sorted(arr)
# Example Usage
arr = [3, 1, 4, 1, 5, 9, 2, 6]
print("Custom Sort:", custom_sort(arr.copy()))
print("Optimized Sort:", optimized_sort(arr.copy()))
Ejercicio 2: Optimización de Memoria en el Procesamiento de Datos
- Objetivo: Optimizar una función de Python para el uso de memoria.
- Tarea: Reescribir una función que procesa un conjunto de datos grande para que sea más eficiente en cuanto a memoria utilizando generadores.
Solución:
# Initial Memory-Intensive Function
def process_data(data):
results = []
for item in data:
results.append(item * 2) # Some processing
return results
# Memory-Optimized Function Using Generators
def optimized_process_data(data):
for item in data:
yield item * 2
# Example Usage
large_data = range(1000000)
print("Memory-Optimized Processing:")
for result in optimized_process_data(large_data):
pass # Replace with actual use of 'result'
Ejercicio 3: Paralelización de una Tarea Intensiva en Cómputo
- Objetivo: Utilizar el multiprocesamiento de Python para optimizar una tarea intensiva en cómputo.
- Tarea: Modificar una función que realiza una operación ligada a la CPU para que utilice múltiples núcleos.
Solución:
from multiprocessing import Pool
def compute_square(n):
return n * n
def parallel_square(numbers):
with Pool(4) as pool:
return pool.map(compute_square, numbers)
# Example Usage
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Parallel Square Computation:", parallel_square(numbers))
Ejercicio 4: Perfilado y Optimización de Código en Python
- Objetivo: Perfilar un script de Python e identificar cuellos de botella.
- Tarea: Utilizar
cProfile
para perfilar la función proporcionada y luego optimizarla.
Función Inicial:
def find_primes(n):
primes = []
for num in range(2, n + 1):
prime = True
for i in range(2, num):
if (num % i) == 0:
prime = False
break
if prime:
primes.append(num)
return primes
# Profiling
import cProfile
cProfile.run('find_primes(1000)')
Función Optimizada:
def optimized_find_primes(n):
primes = []
for num in range(2, n + 1):
if all(num % i != 0 for i in range(2, int(num**0.5) + 1)):
primes.append(num)
return primes
# Example Usage and Profiling
cProfile.run('optimized_find_primes(1000)')
Ejercicios Prácticos para el Capítulo 11
Los siguientes ejercicios brindan oportunidades prácticas para profundizar y mejorar el código Python para obtener un rendimiento y eficiencia superiores. Cubren una variedad de situaciones, que incluyen el refinamiento de algoritmos de ordenación, la gestión de conjuntos de datos extensos y la aplicación de técnicas de procesamiento paralelo. Estos ejercicios están diseñados para reflejar desafíos de codificación reales que puede encontrar.
Ejercicio 1: Optimización de una Función de Ordenación
- Objetivo: Mejorar el rendimiento de una función de ordenación de Python.
- Tarea: Implementar una función de ordenación personalizada y luego optimizarla utilizando funcionalidades integradas de Python.
Solución:
# Initial Custom Sorting Function
def custom_sort(arr):
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] > arr[j]:
arr[i], arr[j] = arr[j], arr[i]
return arr
# Optimized Sorting Using Built-in Sort
def optimized_sort(arr):
return sorted(arr)
# Example Usage
arr = [3, 1, 4, 1, 5, 9, 2, 6]
print("Custom Sort:", custom_sort(arr.copy()))
print("Optimized Sort:", optimized_sort(arr.copy()))
Ejercicio 2: Optimización de Memoria en el Procesamiento de Datos
- Objetivo: Optimizar una función de Python para el uso de memoria.
- Tarea: Reescribir una función que procesa un conjunto de datos grande para que sea más eficiente en cuanto a memoria utilizando generadores.
Solución:
# Initial Memory-Intensive Function
def process_data(data):
results = []
for item in data:
results.append(item * 2) # Some processing
return results
# Memory-Optimized Function Using Generators
def optimized_process_data(data):
for item in data:
yield item * 2
# Example Usage
large_data = range(1000000)
print("Memory-Optimized Processing:")
for result in optimized_process_data(large_data):
pass # Replace with actual use of 'result'
Ejercicio 3: Paralelización de una Tarea Intensiva en Cómputo
- Objetivo: Utilizar el multiprocesamiento de Python para optimizar una tarea intensiva en cómputo.
- Tarea: Modificar una función que realiza una operación ligada a la CPU para que utilice múltiples núcleos.
Solución:
from multiprocessing import Pool
def compute_square(n):
return n * n
def parallel_square(numbers):
with Pool(4) as pool:
return pool.map(compute_square, numbers)
# Example Usage
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Parallel Square Computation:", parallel_square(numbers))
Ejercicio 4: Perfilado y Optimización de Código en Python
- Objetivo: Perfilar un script de Python e identificar cuellos de botella.
- Tarea: Utilizar
cProfile
para perfilar la función proporcionada y luego optimizarla.
Función Inicial:
def find_primes(n):
primes = []
for num in range(2, n + 1):
prime = True
for i in range(2, num):
if (num % i) == 0:
prime = False
break
if prime:
primes.append(num)
return primes
# Profiling
import cProfile
cProfile.run('find_primes(1000)')
Función Optimizada:
def optimized_find_primes(n):
primes = []
for num in range(2, n + 1):
if all(num % i != 0 for i in range(2, int(num**0.5) + 1)):
primes.append(num)
return primes
# Example Usage and Profiling
cProfile.run('optimized_find_primes(1000)')
Ejercicios Prácticos para el Capítulo 11
Los siguientes ejercicios brindan oportunidades prácticas para profundizar y mejorar el código Python para obtener un rendimiento y eficiencia superiores. Cubren una variedad de situaciones, que incluyen el refinamiento de algoritmos de ordenación, la gestión de conjuntos de datos extensos y la aplicación de técnicas de procesamiento paralelo. Estos ejercicios están diseñados para reflejar desafíos de codificación reales que puede encontrar.
Ejercicio 1: Optimización de una Función de Ordenación
- Objetivo: Mejorar el rendimiento de una función de ordenación de Python.
- Tarea: Implementar una función de ordenación personalizada y luego optimizarla utilizando funcionalidades integradas de Python.
Solución:
# Initial Custom Sorting Function
def custom_sort(arr):
for i in range(len(arr)):
for j in range(i + 1, len(arr)):
if arr[i] > arr[j]:
arr[i], arr[j] = arr[j], arr[i]
return arr
# Optimized Sorting Using Built-in Sort
def optimized_sort(arr):
return sorted(arr)
# Example Usage
arr = [3, 1, 4, 1, 5, 9, 2, 6]
print("Custom Sort:", custom_sort(arr.copy()))
print("Optimized Sort:", optimized_sort(arr.copy()))
Ejercicio 2: Optimización de Memoria en el Procesamiento de Datos
- Objetivo: Optimizar una función de Python para el uso de memoria.
- Tarea: Reescribir una función que procesa un conjunto de datos grande para que sea más eficiente en cuanto a memoria utilizando generadores.
Solución:
# Initial Memory-Intensive Function
def process_data(data):
results = []
for item in data:
results.append(item * 2) # Some processing
return results
# Memory-Optimized Function Using Generators
def optimized_process_data(data):
for item in data:
yield item * 2
# Example Usage
large_data = range(1000000)
print("Memory-Optimized Processing:")
for result in optimized_process_data(large_data):
pass # Replace with actual use of 'result'
Ejercicio 3: Paralelización de una Tarea Intensiva en Cómputo
- Objetivo: Utilizar el multiprocesamiento de Python para optimizar una tarea intensiva en cómputo.
- Tarea: Modificar una función que realiza una operación ligada a la CPU para que utilice múltiples núcleos.
Solución:
from multiprocessing import Pool
def compute_square(n):
return n * n
def parallel_square(numbers):
with Pool(4) as pool:
return pool.map(compute_square, numbers)
# Example Usage
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print("Parallel Square Computation:", parallel_square(numbers))
Ejercicio 4: Perfilado y Optimización de Código en Python
- Objetivo: Perfilar un script de Python e identificar cuellos de botella.
- Tarea: Utilizar
cProfile
para perfilar la función proporcionada y luego optimizarla.
Función Inicial:
def find_primes(n):
primes = []
for num in range(2, n + 1):
prime = True
for i in range(2, num):
if (num % i) == 0:
prime = False
break
if prime:
primes.append(num)
return primes
# Profiling
import cProfile
cProfile.run('find_primes(1000)')
Función Optimizada:
def optimized_find_primes(n):
primes = []
for num in range(2, n + 1):
if all(num % i != 0 for i in range(2, int(num**0.5) + 1)):
primes.append(num)
return primes
# Example Usage and Profiling
cProfile.run('optimized_find_primes(1000)')