Menu iconMenu icon
Algoritmos y Estructuras de Datos con Python

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)')