The preferred workflow that you&#x27;ve described seems to be a (more considered) form of the standard Cython workflow that I see described:<p>(1) Write Python.
(2) Compile with Cython.
(3) Run compiled Cython, profile &amp; review.
(4) Consider what Cython annotations to make to code; make code changes.
(5) Goto 2.<p>The emphasis is always on iteration &amp; incremental additions.<p>Of course I practice iterative &amp; incremental development, and of course I&#x27;ll prototype a quick proof-of-concept implementation first (often in Python+Numpy) before profiling &amp; algorithmic optimization.  But the Cython workflow seems to me to add more iteration (of incremental Cython syntax additions) than is really necessary.  When I&#x27;m working to implement some algorithm, I don&#x27;t really want to iteratively learn how Cython or CPython implement various Python functions; I&#x27;d rather write my &quot;proper version&quot; code just once, properly the first time.<p>So why not take it to the logical extreme and write it all in Cython-lang from the start?  If we&#x27;re writing for-keeps code in a language with Pythonic syntax &amp; static types, I find Nim-lang a more expressive, more full-featured language (with features such as generics &amp; type-safe Lisp-like macros, in particular; I note that Cython <i>does</i> support pointers &amp; operator overloading) than Cython-lang in general-purpose uses, without being very different at all in simple uses.<p>For example, there is an example `primes` function in the Cython tutorial: <a href="http:&#x2F;&#x2F;docs.cython.org&#x2F;src&#x2F;tutorial&#x2F;cython_tutorial.html#primes" rel="nofollow">http:&#x2F;&#x2F;docs.cython.org&#x2F;src&#x2F;tutorial&#x2F;cython_tutorial.html#pri...</a><p>Here is an equivalent implementation in Nim.  As you can see, it&#x27;s really almost identical in syntax:<p><pre><code>  proc primes(kmax: int): seq[int] =
    var kmax = kmax
    var n, k, i: int
    var p: array[1000, int]
    result = @[]
    if kmax &gt; 1000:
      kmax = 1000
    k = 0
    n = 2
    while k &lt; kmax:
      i = 0
      while i &lt; k and n mod p[i] != 0:
        i = i + 1
      if i == k:
        p[k] = n
        k = k + 1
        result.add(n)
      n = n + 1
    return result
</code></pre>
All of this said, I understand that a great deal of this decision comes down to personal preference:  Would you rather start with Python &amp; then iteratively diverge?  Would you rather start &amp; stay in Nim?  And I can also see the benefit of both approaches in different circumstances. :)