I am using Python while working through the book. For what its worth:
- I piggyback my tuples and matrices on numpy ndarrays, delegating most of the operations to the numpy implementations.
- caching inverse of the matrix helps with the performance a lot, probably order of a magnitude on a typical scene.
- I do most of my renderings in the Jupyter notebook, which is able to visualize the scene inline, without the intermediate step of generating a *.ppm file
- most of the work renderings are done with the 100x50 resolution, typically it takes 2 to 3 seconds on my laptop for a simple-ish scene; once I am satisfied with the composition, I re-render with a larger resolution, which may take minutes.