对Lua中的协程的支持是由functions in the coroutine
table提供的,主要是create
、resume
和yield
。开发人员将这些协程描述为stackful, first-class and asymmetric。
在Python中也可以使用协程,可以使用enhanced generators (和yield from
),也可以使用3.5版中添加的async
and await
。
Python中的协程与Lua中的协程相比如何?它们也是堆叠的、一流的和不对称的吗?
为什么Python需要这么多构造(async def
、async with
、async for
、asynchronous comprehensions等)对于协程,而Lua只能为它们提供三个内置函数?
发布于 2016-09-30 17:22:59
我刚刚第一次看到了包括sieve.lua
live demo在内的lua
。它是使用协程的Erathostenes筛子的一个实现。我的第一个想法是:这在python中看起来要干净得多:
#!/usr/bin/env python3
# sieve.py
# the sieve of Eratosthenes programmed with a generator functions
# typical usage: ./sieve.py 500 | column
import sys
# generate all the numbers from 2 to n
def gen(n):
for i in range(2,n):
yield i
# filter the numbers generated by `g', removing multiples of `p'
def filter(p, g):
for n in g:
if n%p !=0:
yield n
N=int(sys.argv[1]) if len(sys.argv)>1 else 500 # from command line
x=gen(N) # generate primes up to N
while True:
try:
n = next(x) # pick a number until done
except StopIteration:
break
print(n) # must be a prime number
x = filter(n, x) # now remove its multiples
这与这个问题没有太多关系,但是在我使用Python 3.4.3
的机器上,N>7500
的某个地方发生了堆栈溢出。结合使用sieve.lua
和Lua 5.2.3
,堆栈溢出已经在N>530
上发生了。
生成器对象(表示挂起的协程)可以像其他对象一样传递,并且可以在任何地方对它应用下一个内置的(),因此python中的协程是一流的。如果我错了,请纠正我。
https://stackoverflow.com/questions/39675844
复制相似问题