Threading module

Multithreading does not magically sped up your code. It's up to you to break the code in chunks that can be run concurrently. When you create 3 threads that run hola, you are not "running hola once using 3 threads", but you are "running hola three times, each time in a different thread.

Although multithreading can be used to perform computation in parallel, the most common python interpreter (CPython) is implemented using a lock (the GIL) that lets only one thread run at a time. There are libraries that release the GIL before doing CPU-intensive work, so threading in python is useful for doing CPU-intensive work. Moreover, I/O operations relese the gil, so multithreading in python is very well suited for I/O work.

As an example, let's imagine that you have to need to access three different sites. You can access them sequentially, one after the other:

import requests

sites = ['https://google.com', 'https://yahoo.com', 'https://rae.es']

def hola(site):
    a = requests.get(site)
    print(site, " answered ", a.status_code)

for s in sites:
    hola(s)

Or concurrently (all at the same time) using threads:

import requests
import threading

sites = ['https://google.com', 'https://yahoo.com', 'https://rae.es']

def hola(site):
    a = requests.get(site)
    print(site, " answered ", a.status_code)

th = [threading.Thread(target=hola, args=(s, )) for s in sites]
for t in th:
    t.start()
for t in th:
    t.join()

Please note that this is a simple example: the output can get scrambled, you have no acces to the return values, etc. For this kind of tasks I would use a thread pool.