Need opinions on P vs NP

Ian Kelly ian.g.kelly at gmail.com
Sat Apr 18 04:33:32 CEST 2015


On Fri, Apr 17, 2015 at 7:19 PM, Paddy <paddy3118 at gmail.com> wrote:
> Having just seen Raymond's talk on Beyond PEP-8 here: https://www.youtube.com/watch?v=wf-BqAjZb8M, it reminded me of my own recent post where I am soliciting opinions from non-newbies on the relative Pythonicity of different versions of a routine that has non-simple array manipulations.
>
> The blog post: http://paddy3118.blogspot.co.uk/2015/04/pythonic-matrix-manipulation.html
>
> The first, (and original), code sample:
>
> def cholesky(A):
>     L = [[0.0] * len(A) for _ in range(len(A))]
>     for i in range(len(A)):
>         for j in range(i+1):
>             s = sum(L[i][k] * L[j][k] for k in range(j))
>             L[i][j] = sqrt(A[i][i] - s) if (i == j) else \
>                       (1.0 / L[j][j] * (A[i][j] - s))
>     return L
>
>
> The second equivalent code sample:
>
> def cholesky2(A):
>     L = [[0.0] * len(A) for _ in range(len(A))]
>     for i, (Ai, Li) in enumerate(zip(A, L)):
>         for j, Lj in enumerate(L[:i+1]):
>             s = sum(Li[k] * Lj[k] for k in range(j))
>             Li[j] = sqrt(Ai[i] - s) if (i == j) else \
>                       (1.0 / Lj[j] * (Ai[j] - s))
>     return L
>
>
> The third:
>
> def cholesky3(A):
>     L = [[0.0] * len(A) for _ in range(len(A))]
>     for i, (Ai, Li) in enumerate(zip(A, L)):
>         for j, Lj in enumerate(L[:i]):
>             #s = fsum(Li[k] * Lj[k] for k in range(j))
>             s = fsum(Lik * Ljk for Lik, Ljk in zip(Li, Lj[:j]))
>             Li[j] = (1.0 / Lj[j] * (Ai[j] - s))
>         s = fsum(Lik * Lik for Lik in Li[:i])
>         Li[i] = sqrt(Ai[i] - s)
>     return L
>
> My blog post gives a little more explanation, but I have yet to receive any comments on relative Pythonicity.

I prefer the first version. You're dealing with mathematical formulas
involving matrices here, so subscripting seems appropriate, and
enumerating out rows and columns just feels weird to me.

That said, I also prefer how the third version pulls the last column
of each row out of the inner loop instead of using a verbose
conditional expression that you already know will be false for every
column except the last one. Do that in the first version, and I think
you've got it.



More information about the Python-list mailing list