What about using numpy as input?
import numpy as np
def f(x,y):
return x+y
a = np.array([0,1,2,3])
b = np.array([1,2,3,4])
In [430]: f(a,b)
Out[430]: array([1, 3, 5, 7])
EDIT
For more complex function you could use list comprehension and zip:
In [451]: [f(*par) for par in zip(a, b)]
Out[451]: [1, 3, 5, 7]
EDIT2
Or you could use np.vectorize as you mentioned in the comment:
f_vec = np.vectorize(f)
In [470]: f_vec([0, 1, 2, 3], [1, 2, 3, 4])
Out[470]: array([1, 3, 5, 7])
Perfomance:
In [471]: %timeit f_vec([0, 1, 2, 3], [1, 2, 3, 4])
10000 loops, best of 3: 38.3 µs per loop
In [472]: %timeit [f(*par) for par in zip([0, 1, 2, 3], [1, 2, 3, 4])]
1000000 loops, best of 3: 1.8 µs per loop
In [476]: %timeit list(map(f, [0, 1, 2, 3], [1, 2, 3, 4]))
1000000 loops, best of 3: 1.51 µs per loop
So if you are interested in performance you should use zip and list comprehension or map solution suggested by @tglaria
np.vectorizewill sacrifice all the performance benefits of NumPy, which is likely to be around a 1000x slowdown. Unless your code involves loops that fundamentally need to execute for a number of times that depends on the input, something like this should be fairly straightforward to vectorize.