programacion - Diferencia entre el rendimiento en Python y el rendimiento en C#
python vs c# español (4)
¿Cuál es la diferencia entre la palabra clave de yield
en Python y la palabra clave de yield
en C #?
El yield return
del yield return
C # es equivalente al yield
de Python, y el yield break
es solo el return
en Python.
Aparte de esas pequeñas diferencias, tienen básicamente el mismo propósito.
Esto puede ayudarte a entenderlo: iteradores en C #, Python y Ruby
La diferencia más importante es que el rendimiento de Python le brinda un iterador, una vez que se haya iterado completamente, se habrá terminado.
Pero el rendimiento de C # le da un iterador "de fábrica" , que puede pasarlo y usarlo en múltiples lugares de su código sin importar si se ha "enrollado" una vez antes.
Toma este ejemplo en python:
In [235]: def func1():
.....: for i in xrange(3):
.....: yield i
.....:
In [236]: x1 = func1()
In [237]: for k in x1:
.....: print k
.....:
0
1
2
In [238]: for k in x1:
.....: print k
.....:
In [239]:
Y en C #:
class Program
{
static IEnumerable<int> Func1()
{
for (int i = 0; i < 3; i++)
yield return i;
}
static void Main(string[] args)
{
var x1 = Func1();
foreach (int k in x1)
Console.WriteLine(k);
foreach (int k in x1)
Console.WriteLine(k);
}
}
Eso te da:
0
1
2
0
1
2
Una distinción importante a destacar, además de otras respuestas, es que el yield
en C # no se puede usar como una expresión, solo como una declaración.
Un ejemplo del uso de la expresión de yield
en Python (ejemplo pegado desde here ):
def echo(value=None):
print "Execution starts when ''next()'' is called for the first time."
try:
while True:
try:
value = (yield value)
except GeneratorExit:
# never catch GeneratorExit
raise
except Exception, e:
value = e
finally:
print "Don''t forget to clean up when ''close()'' is called."
generator = echo(1)
print generator.next()
# Execution starts when ''next()'' is called for the first time.
# prints 1
print generator.next()
# prints None
print generator.send(2)
# prints 2
generator.throw(TypeError, "spam")
# throws TypeError(''spam'',)
generator.close()
# prints "Don''t forget to clean up when ''close()'' is called."