Taxicab numbers algorithm check
As you said in the question you don't think this is very performant.

You only need two loops. If you go through every \$i\$ and \$j\$, then you have gone through every \$k\$ and \$l\$.
And so you don't need the \$k\$ and \$l\$ loops.

After this you have the equation:

$$\text{outcome} = i^3 + j^3$$

Since you know what \$\text{outcome}\$ is, it doesn't make sense for it to be what you're finding.
Instead if you re-arrange your code so that you can find \$j\$ for each \$i\$, then you can do everything in one loop.

$$j = (\text{outcome} - i^3)^{\frac{1}{3}}$$

And so to generate a list of \$i\$ and \$j\$ you can:

def generate_products(total):
    for i in range(int(total ** (1/3))+1):
        t = total - i ** 3
        # fix floating point error
        j = round(t ** (1/3))
        if t == j**3:
            yield i, j


After this you want to then combine these. If you're ok with \$i = k,j = l\$ then you can use itertools.product, otherwise you'd want itertools.permutations.
Which can produce all the numbers from 1 to 5000 in a couple of seconds.

def generate_products(total):
    for i in range(int(total ** (1/3))+1):
        t = total - i ** 3
        # fix floating point error
        j = round(t ** (1/3))
        if t == j**3:
            yield i, j

def generate_taxicab_numbers(outcome):
    for (i, j), (k, l) in itertools.permutations(generate_products(outcome), 2):
        print("{} = {}**3 + {}**3 = {}**3 + {}**3".format(outcome, i, j, k, l))

if __name__ == '__main__':
    for outcome in range(1000, 5000):
        generate_taxicab_numbers(outcome)


The slowest part of this is the print calls, and so if you move them out of the loops the code becomes even faster.

def generate_products(total):
    for i in range(int(total ** (1/3))+1):
        t = total - i ** 3
        # fix floating point error
        j = round(t ** (1/3))
        if t == j**3:
            yield i, j

def generate_taxicab_numbers(outcome):
    for (i, j), (k, l) in itertools.permutations(generate_products(outcome), 2):
        yield i, j, k, l

if __name__ == '__main__':
    to_print = []
    for outcome in range(1000, 5000):
        for nums in generate_taxicab_numbers(outcome):
            to_print.append("{} = {}**3 + {}**3 = {}**3 + {}**3".format(outcome, *nums))
    print('\n'.join(to_print))