I would like to add:
1) Making str.center do some of the dirty work
2) Using ranges (and chain) to iterate up and down instead of keeping a state on num
fromitertoolsimportchaindefdiamond(n):ifn<=0orn%2==0:raiseValueError('n must be odd and positive')foriinchain(range(1,n+1,2),reversed(range(1,n,2))):print(('*'*i).center(n))diamond(1)diamond(3)diamond(5)
It might be more readable to have two loops instead of using chain but I like chaining more because I don't need to repeat the print
I wouldn't worry about it too much, since print requires IO, it is by far the bottleneck.
For the rest of the utilities that I used: range, chain, and str.center: they are all implemented in C if you are using the standard CPython (should be fast).
To avoid the IO, let's compare the two functions as generators of strings (I replaced the print with yield (('*' * i).center(n)) for both my implementation and Nicks:
In [39]: %timeit tuple(my_diamond(11))
3.59 µs ± 37.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [40]: %timeit tuple(nicks_diamond(11))
4.66 µs ± 69.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Seems like mine is slower than Nicks.
However, on my machine, a single print statement takes about 4.17us, which is almost as long as diamond(11) takes without any prints!
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
I would like to add:
1) Making
str.centerdo some of the dirty work2) Using ranges (and
chain) to iterate up and down instead of keeping a state onnumIt might be more readable to have two loops instead of using
chainbut I likechaining more because I don't need to repeat theprintIs this fast too?
I wouldn't worry about it too much, since
printrequires IO, it is by far the bottleneck.For the rest of the utilities that I used:
range,chain, andstr.center: they are all implemented inCif you are using the standardCPython(should be fast).To avoid the IO, let's compare the two functions as generators of strings (I replaced the
printwithyield (('*' * i).center(n))for both my implementation and Nicks:Seems like mine is slower than Nicks.
However, on my machine, a single print statement takes about 4.17us, which is almost as long as
diamond(11)takes without any prints!