My Lispy code in Python
(Posted on 2022-03-22)
I translated my function in Lisp to Python.
def get_the_longest_prefix(a, b, ans):
if len(a) == 0 or len(b) == 0:
return "".join(ans)
if a[0] == b[0]:
return get_the_longest_prefix(a[1:], b[1:], ans + [a[0]])
if a[0] == '-':
return get_the_longest_prefix(a[1:], b, ans + ['-'])
if b[0] == '-':
return get_the_longest_prefix(a, b[1:], ans + ['-'])
return "".join(ans)
And it has too many “return” statements. Anyway, I suppose Python doesn’t prefer a recursion. So this isn’t the case when we code in the Python way.
The code above concatenate Python's lists instead of creating a linked list like in Lisp.
So I made this experiment.
import time
n = 100
# Concatinating vectors
v = []
t1 = time.time_ns()
for i in range(n):
v = [i] + v
t2 = time.time_ns()
# Creating cons cells for a singly link list
l = None
t3 = time.time_ns()
for i in range(n):
l = (i, l) # Creating a cons cell
t4 = time.time_ns()
print((t2-t1)/(t4-t3))
At n = 100, concatenating vectors require 2 times of running time compared to creating cons cells for a linked list. So I keep using linked lists.