{"id":2771,"date":"2020-04-07T00:43:56","date_gmt":"2020-04-07T03:43:56","guid":{"rendered":"https:\/\/www.geekosas.com\/?p=2771"},"modified":"2020-04-07T23:04:27","modified_gmt":"2020-04-08T02:04:27","slug":"comparativa-entre-julia-python-y-r","status":"publish","type":"post","link":"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/","title":{"rendered":"Comparativa entre Julia, Python y R"},"content":{"rendered":"<p>La discusi\u00f3n sobre que lenguaje es el mejor para analizar datos puede llevarnos a conversaciones mas apasionadas que por temas como religi\u00f3n o pol\u00edtica. Pero como Data-Scientist debemos enfocarnos en la evidencia emp\u00edrica, las dimensiones con las que se podr\u00edan comparar son muchas: Comunidad, Performance, Editores, Gestor de Paquetes, Encapsulaci\u00f3n de C\u00f3digo, etc&#8230; He evaluado varias de esas dimensiones y me cuesta decir cual es el mejor, algunos ganan en una otros en otra.<br \/>\n<!--more--><\/p>\n<p>De todas las dimensiones, creo que hay 3 que hacen que un lenguaje de An\u00e1lisis de Datos sea efectivo y el resto vendr\u00e1n gracias a sus comunidades:<br \/>\n1) Existencia de una consola REPL, para as\u00ed poder hacer pruebas.<br \/>\n2) Performance, por que si es lento, no podremos ejecutar nada.<br \/>\n3) Numero de Lineas para ejecutar, debido a que la prueba y error son los padres de la ciencia y cada experimento no puede tomar mucho tiempo.<\/p>\n<p>Hay mas de tres lenguaje que cumple estas condiciones, como por ejemplo Ruby o Kotlin, pero nos enfocaremos en Python, R y Julia.<\/p>\n<p><strong>Python<\/strong> es un lenguaje multi-proposito orientado a objetos sobre el cual se han desarrollado paquetes para analizar datos como: pandas para tablas, scikit para Machine Learning y Numpy para matrices entre otros. su principal fortaleza es que como cualquier desarrollo se puede realizar en Python, facilita mucho integrar modelos en aplicaciones productivas.<br \/>\n<strong>R<\/strong> es un lenguaje funcional inventado para analizar datos, su principal estructura de datos son los DataFrames (tablas en memoria) y todo el lenguaje gira en torno a estas, a pesar de que R est\u00e1 enfocado a manipular tablas, gracias a su tremenda comunidad hoy en d\u00eda se pueden hacer cosas completamente distintas e inesperadas de este como paginas web (en shiny) o APIs REST (plumber).<br \/>\n<strong>Julia<\/strong>  por ultimo es otro lenguaje funcional muy nuevo, similar a R pero que no gira tan en torno a los DataFrames, su foco es ser r\u00e1pido y distribuido, logrando un performance cercano al de C++, lo interesante es que mientras que las librer\u00edas eficientes de R y Python est\u00e1n programadas en otro lenguaje, Julia est\u00e1 principalmente escrito en Julia.<\/p>\n<p>Los tres lenguajes anteriores son de <strong>alto nivel y tienen una consola REPL<\/strong>, por lo que a travez de 4 experimentos nos enfocaremos en las dimensiones <strong>2) Performance<\/strong> y <strong>3) Numero de lineas<\/strong>, por otro lado, dado que Julia es muy nuevo, tendremos los resultados de Julia actual y los de 6 meses atr\u00e1s.<\/p>\n<h3> Experimento 1 <\/h3>\n<p><strong>Agregaci\u00f3n sobre un DataFrame de 10 millones de registro<\/strong>, algunos lenguajes tienen mas de una librer\u00eda para realizar esto, por lo que habr\u00e1 mas de un resultado para cada uno.<br \/>\nEn el siguiente gr\u00e1fico vemos los tiempos para distintas librer\u00edas para ejecutar la misma agregaci\u00f3n, donde:<br \/>\n<strong>data.table<\/strong> Es una librer\u00eda para manipular tablas programada en C y enfocada principalmente en se r\u00e1pida.<br \/>\n<strong>data.table + setkey<\/strong> los data.tables permiten crear indices, en este caso se creo un indice sobre la columna que se agreg\u00f3.<br \/>\n<strong>DataFrames<\/strong> Es una de las librer\u00edas para manipular tablas en Julia.<br \/>\n<strong>JuliaDB<\/strong> Es una de las librer\u00edas para manipular tablas en Julia.<br \/>\n<strong>pandas<\/strong> Es la libreria para manipular tablas en Python, est\u00e1 basada en Numpy.<br \/>\n<strong>Queryverse<\/strong> Es una de las librer\u00edas para manipular tablas en Julia y tiene como objetivo imitar a tidyverse<br \/>\n<strong>tidyverse<\/strong> en verdad dplyr, el cual debido a su f\u00e1cil notaci\u00f3n, es la librer\u00eda m\u00e1s popular para manipular tablas en R.<\/p>\n<p><strong>BarPlot de Tiempos en ejecutar<\/strong><br \/>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2847\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/agregacion-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion.png?fit=2731%2C1696&amp;ssl=1\" data-orig-size=\"2731,1696\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"agregacion\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion.png?fit=1024%2C636&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion-1024x636.png?resize=810%2C503&#038;ssl=1\" alt=\"\" width=\"810\" height=\"503\" class=\"alignnone size-large wp-image-2847\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion.png?resize=1024%2C636&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion.png?resize=300%2C186&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion.png?resize=768%2C477&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion.png?resize=1536%2C954&amp;ssl=1 1536w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2020\/04\/agregacion.png?resize=2048%2C1272&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/p>\n<p>Claramente Julia no es el mas r\u00e1pido, lo fue <strong>python que en el ultimo tiempo ha optimizado mucho pandas<\/strong>, pero si se puede destacar que en los \u00faltimos 6 meses ha mejorado mucho, alcanzando a los data.tables (data.tables + setkey considera solo el tiempo de agregaci\u00f3n, no de crear el indice,por eso no puede considerarse ganador), cabe destacar que como <strong>Julia esta escrito en Julia, estas agregaciones se pueden programaren en un loop sin perder velocidad, <\/strong> a continuaci\u00f3n en la secci\u00f3n de los c\u00f3digos mostrare al final un ejemplo.<\/p>\n<p>Los c\u00f3digos para realizar cada uno de estas agregaciones es el siguiente:<\/p>\n<p><strong>data.table<\/strong><br \/>\n<code> dt[,list(valor = mean(valor)),by='categoria'] <\/code><br \/>\n<strong>data.table + setkey<\/strong><br \/>\n<code> setkey(dt,categoria)<br \/>\ndt[,list(valor = mean(valor)),by='categoria'] <\/code><br \/>\n<strong>DataFrames<\/strong><br \/>\n<code> aggregate(datos,:categoria,[mean]) <\/code><br \/>\n\u00f3 <code> by(datos,:categoria,x->(promedio = mean(x.valor))) <\/code><br \/>\n<strong>JuliaDB<\/strong><br \/>\n<code> JuliaDB.groupby(mean, indexed, :categoria, select =:valor) <\/code><br \/>\n<strong>pandas<\/strong><br \/>\n<code> datos.groupby(['categoria']).aggregate(np.mean) <\/code><br \/>\n<strong>Queryverse<\/strong><br \/>\n<code> datos |> @groupby(_.categoria) |> @map({categoria = key(_),promedio = mean(_.valor)}) |> DataFrame <\/code><br \/>\n<strong>tidyverse<\/strong><br \/>\n<code> datos %>% group_by(categoria) %>% summarise(valor = mean(valor)) <\/code><br \/>\n<strong>Julia usando un Loop<\/strong><br \/>\n<code>  results = []<br \/>\n  for slice in groupby(datos,:categoria)<br \/>\n    push!(results,(promedio = slice.categoria[1], valor =  mean(slice.valor)))<br \/>\n  end<br \/>\n  DataFrame(results)<\/code><\/p>\n<p>Todos son similar en largo, pero la escritura de Queryverse y tidyverse son los mas claros y flexibles, por otro el \u00faltimo ejemplo conjulia, tiene el performance de DataFrames, pero con la m\u00e1xima flexibilidad, no as\u00ed en eficiencia en el numero de lineas.<\/p>\n<h3> Experimento 2 <\/h3>\n<p><strong> Recursividad <\/strong>,en particular series de <strong>fibonacci<\/strong> programadas en una funci\u00f3n recursiva. una funci\u00f3n recursiva es aquella que se llama a si misma varias veces para obtener un resultado, por lo que este exterimento medir\u00e1 la eficiencia en c\u00f3digo explicito, sin librer\u00edas.<\/p>\n<p>En particular calcularemos Fibonacci(100), lo que nos obliga a llamar a la funcion 100 veces.<\/p>\n<p>Todos los codigos son muy similares, por lo que solo pondr\u00e9 el codigo en python:<br \/>\n<code>def fico(n,contador = 2, ant = 1, antant = 0):<br \/>\n  if(n <= 1):\n    return n\n  if(n == contador):\n    return ant + antant\n  else:\n    return fico(n,contador+1,ant + antant,ant)<\/code><\/p>\n<p>Donde no son tan similares es el tiempo deje ejecuci\u00f3n, a continuaci\u00f3n los tiempo ej ejecutar la funci\u00f3n para cada lenguaje en 2 fechasdistintas. Donde el claro perdedor es python del 2020\/08\/01 que correspond\u00eda a python 3.7<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2857\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/fibonacci\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci.png?fit=2731%2C1696&amp;ssl=1\" data-orig-size=\"2731,1696\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"fibonacci\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci.png?fit=1024%2C636&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci-1024x636.png?resize=810%2C503&#038;ssl=1\" alt=\"\" width=\"810\" height=\"503\" class=\"alignnone size-large wp-image-2857\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci.png?resize=1024%2C636&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci.png?resize=300%2C186&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci.png?resize=768%2C477&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci.png?resize=1536%2C954&amp;ssl=1 1536w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci.png?resize=2048%2C1272&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/p>\n<p>Ahora si vemos los resultados en escala logaritmica (log10), vemos que los 3 lenguajes han mejorado en los ultimos 6 meses y Julia es el claro ganador por mas de 2<br \/>\nordenes de magnitud, por otro lado python 3.8 mejor\u00f3 mucho con respecto a la versi\u00f3n anterior, logrando quedar a la par con R.<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2856\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/fibonacci_log-2\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1.png?fit=2731%2C1696&amp;ssl=1\" data-orig-size=\"2731,1696\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"fibonacci_log\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1.png?fit=1024%2C636&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1-1024x636.png?resize=810%2C503&#038;ssl=1\" alt=\"\" width=\"810\" height=\"503\" class=\"alignnone size-large wp-image-2856\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1.png?resize=1024%2C636&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1.png?resize=300%2C186&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1.png?resize=768%2C477&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1.png?resize=1536%2C954&amp;ssl=1 1536w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fibonacci_log-1.png?resize=2048%2C1272&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/p>\n<p>Francamente los tiempos para cada lenguaje fueron chicos, por lo que solo recomendar\u00eda Julia si en tu modelo hay que llamar mucho a alguna funci\u00f3n hecha por ti, por ejemplo en Optimizaci\u00f3n utilizando el m\u00e9todo del gradiente.<\/p>\n<h3> Experimento 3 <\/h3>\n<p><strong>Performance sobre Matrices<\/strong><\/p>\n<p>Los tres lenguajes son muy potentes en manejo de matrices, se pueden realizar muchas operaciones sobre matrices, pero escog\u00ed la descomposici\u00f3n en valores propios para realizar la prueba, esta es una operaci\u00f3n relativamente pesada.<\/p>\n<p><strong>BarPlot de tiempos en calcular valores propios<\/strong><br \/>\n<img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2863\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/svd-3\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/svd.png?fit=2421%2C1696&amp;ssl=1\" data-orig-size=\"2421,1696\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"svd\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/svd.png?fit=1024%2C717&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2019\/09\/svd-1024x717.png?resize=810%2C567&#038;ssl=1\" alt=\"\" width=\"810\" height=\"567\" class=\"alignnone size-large wp-image-2863\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/svd.png?resize=1024%2C717&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/svd.png?resize=300%2C210&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/svd.png?resize=768%2C538&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/svd.png?resize=1536%2C1076&amp;ssl=1 1536w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/svd.png?resize=2048%2C1435&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/p>\n<p>Vemos que Julia es el m\u00e1s r\u00e1pido, pero est\u00e1 muy cercano a R, por otro lado Python se escapa.<\/p>\n<p>Por otro lado, la notaci\u00f3n para los 3 casos es muy similar, pero la pondr\u00e9 de tomos modos.<br \/>\n<strong>R<\/strong><br \/>\n<code>mat = matrix(runif(1000*1000),nrow=1000)<br \/>\nsvd(mat)<\/code><\/p>\n<p><strong>Julia<\/strong><br \/>\n<code>mat = rand(1000,1000)<br \/>\nsvd(mat)<\/code><\/p>\n<p><strong>Python<\/strong> es un poco distinto por ser orientado a objetos<br \/>\n<code>mat = np.random.rand(1000,1000)<br \/>\nnp.linalg.svd(mat)<\/code><\/p>\n<h1>Experimento 4<\/h1>\n<p>Tiempo en modificar los elementos de una matriz dentro de un loop.<\/p>\n<p>En este caso en un loop, llenaremos la matriz anterior con mat[i,j] = i + j, los tiempos quedan reflejados en el siguiente grafico:<\/p>\n<p><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2864\" data-permalink=\"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/fill\/\" data-orig-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fill.png?fit=2421%2C1696&amp;ssl=1\" data-orig-size=\"2421,1696\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"fill\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fill.png?fit=1024%2C717&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/www.geekosas.com\/wp-content\/uploads\/2019\/09\/fill-1024x717.png?resize=810%2C567&#038;ssl=1\" alt=\"\" width=\"810\" height=\"567\" class=\"alignnone size-large wp-image-2864\" srcset=\"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fill.png?resize=1024%2C717&amp;ssl=1 1024w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fill.png?resize=300%2C210&amp;ssl=1 300w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fill.png?resize=768%2C538&amp;ssl=1 768w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fill.png?resize=1536%2C1076&amp;ssl=1 1536w, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/fill.png?resize=2048%2C1435&amp;ssl=1 2048w\" sizes=\"auto, (max-width: 810px) 100vw, 810px\" \/><\/p>\n<p>Python es lejos el m\u00e1s lento, aunque ha mejorado en pyton 3.8, por otro lado dado que los objetos de R son inmutables, esperaba peores resultados.<\/p>\n<p>Nuevamente los codigos son similares, pero quiero compartir una menci\u00f3n honrosa en python que permite iterar sobre 2 variables con un for:<br \/>\n<code>import itertools<br \/>\nfor i,j in itertools.product(range(1000),range(1000)):<br \/>\n      mat[i,j] = i+j<\/code><\/p>\n<h1>Nota al Pie<\/h1>\n<p>Hice este an\u00e1lisis por que record\u00e9 que la ultima vez que intent\u00e9 usar Julia, fue muy molesto el que los import de librer\u00edas tomaban mucho tiempo, esto mejor\u00f3, pero aun toman mucho, en especial en librer\u00edas grandes como Queryverse, de todos modos es un proyecto interesante.<\/p>\n<p>Por otro lado, en general los lenguajes se parecen, pero creo que donde hay mas diferencia es en la orientaci\u00f3n a objetos de python, que queda muy manifiesta en como se manipulan los DataFrames de Pandas.<\/p>\n<p>Por \u00faltimo, aunque las diferencias en performance parezcan grandes, de todos modos al comparar con Excel, las 3 alternativas son r\u00e1pidas y eficientes.<\/p>\n<p>Saludos!<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>La discusi\u00f3n sobre que lenguaje es el mejor para analizar datos puede llevarnos a conversaciones mas apasionadas que por temas como religi\u00f3n o pol\u00edtica. Pero <a class=\"mh-excerpt-more\" href=\"https:\/\/geekosas.com\/index.php\/es\/2020\/04\/07\/comparativa-entre-julia-python-y-r\/\" title=\"Comparativa entre Julia, Python y R\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":2866,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[1],"tags":[],"class_list":["post-2771","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-sin-categoria"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/09\/external-content.duckduckgo.com_.jpg?fit=474%2C312&ssl=1","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8vjqF-IH","jetpack-related-posts":[{"id":3115,"url":"https:\/\/geekosas.com\/index.php\/es\/2022\/05\/07\/buenas-practicas-al-programar-con-codigo\/","url_meta":{"origin":2771,"position":0},"title":"Buenas pr\u00e1cticas al programar (con c\u00f3digo)","author":"Daniel Fischer","date":"2022-05-07","format":false,"excerpt":"Muchos disfrutan programar y resolver laberintos algor\u00edtmicos en su lenguaje favorito, pero lo que a nadie le gusta, es meterse en un c\u00f3digo viejo o incluso peor, en un c\u00f3digo escrito por otro. A m\u00ed me ha tocado hacerlo ya varias veces, algunas veces ha sido malo, otras veces peor,\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2022\/05\/logo.png?fit=1200%2C600&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":2639,"url":"https:\/\/geekosas.com\/index.php\/es\/2019\/02\/12\/r-y-pc-superdorerosos\/","url_meta":{"origin":2771,"position":1},"title":"R y PC super-porerosos","author":"Daniel Fischer","date":"2019-02-12","format":false,"excerpt":"R y python est\u00e1n muy de moda \u00faltimamente, pero te haz preguntado si le est\u00e1s sacan totalmente el jugo a esos lenguajes, es m\u00e1s, seguramente para trabajar con ellos tienes un PC super-poderoso, bueno, la verdad es que si est\u00e1s entrando al mundo del Analytics, posiblemente aun no lo est\u00e9s\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2019\/02\/2922898-a.jpg?fit=350%2C350&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":23,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/04\/12\/sobre-linux\/","url_meta":{"origin":2771,"position":2},"title":"Sobre Linux","author":"Daniel Fischer","date":"2016-04-12","format":false,"excerpt":"Si un d\u00eda por la ma\u00f1ana, despiertas con la inspiraci\u00f3n de descubrir algo nuevo y pones en wikipedia el bot\u00f3n Pagina Aleatorea, con una probabilidad de 1\/1.233.000, caer\u00e1s en el articulo sobre Linux. Si quieres esperar a ese evento, puedes seguir intentando, si no, puedes seguir leyendo este articulo sobre\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/04\/linux.png?fit=387%2C442&ssl=1&resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2269,"url":"https:\/\/geekosas.com\/index.php\/es\/2017\/12\/18\/estimacion-repartija-de-votos-segunda-vuelta-presidenciales-chile-2017\/","url_meta":{"origin":2771,"position":3},"title":"Estimaci\u00f3n repartija de votos segunda vuelta presidenciales Chile 2017","author":"Daniel Fischer","date":"2017-12-18","format":false,"excerpt":"Este Articulo fu\u00e9 hecho apurado y con pocos datos, el definitivo est\u00e1 en\u00a0Quien vot\u00f3 por cada Candidato? Despu\u00e9s de la primera vuelta de las elecciones presidenciales de Chile, es tradicional que cada uno de los candidatos comienza a \"rematar\" los votos de sus seguidores a aquel candidato con el que\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2017\/12\/segunda-vuelta.jpg?fit=710%2C399&ssl=1&resize=700%2C400 2x"},"classes":[]},{"id":2476,"url":"https:\/\/geekosas.com\/index.php\/es\/2018\/08\/12\/que-ve-el-machine-learning\/","url_meta":{"origin":2771,"position":4},"title":"Que ve el machine learning?","author":"Daniel Fischer","date":"2018-08-12","format":false,"excerpt":"Los algoritmos de machine learning logran entender problemas de cientos o a veces miles de dimensiones, logrando as\u00ed ver cosas que el ojo humano no podr\u00eda de otro modo ver, pero... \u00bfcomo se comparan estos m\u00e9todos cuando el ojo humano si puede ver? Por ello generamos una serie de experimentos\u2026","rel":"","context":"In &quot;Sin categor\u00eda&quot;","block_context":{"text":"Sin categor\u00eda","link":"https:\/\/geekosas.com\/index.php\/category\/sin-categoria\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=525%2C300 1.5x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=700%2C400 2x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2018\/08\/1_2UjSSQwW0bns1lPIuRxccQ.png?fit=1200%2C629&ssl=1&resize=1050%2C600 3x"},"classes":[]},{"id":2067,"url":"https:\/\/geekosas.com\/index.php\/es\/2016\/03\/27\/que-son-las-redes-neuronales\/","url_meta":{"origin":2771,"position":5},"title":"Que son las redes neuronales?","author":"Daniel Fischer","date":"2016-03-27","format":false,"excerpt":"Muchos han escuchado alguna vez hablar sobre las redes neuronales o la \"inteligencia artificial\" y hemos de ser honestos que cuando alguien utiliza aquellas palabras, suena como todo un Einstein de la computaci\u00f3n sacado de Terminator 2. B\u00e1sicamente, las redes neuronales, se aplican cuando el desarrollador no tiene la m\u00e1s\u2026","rel":"","context":"In &quot;Uncategorized&quot;","block_context":{"text":"Uncategorized","link":"https:\/\/geekosas.com\/index.php\/es\/category\/uncategorized-es\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=350%2C200","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=350%2C200 1x, https:\/\/i0.wp.com\/geekosas.com\/wp-content\/uploads\/2016\/03\/ai.jpg?fit=608%2C211&ssl=1&resize=525%2C300 1.5x"},"classes":[]}],"_links":{"self":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2771","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/comments?post=2771"}],"version-history":[{"count":20,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2771\/revisions"}],"predecessor-version":[{"id":2869,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/posts\/2771\/revisions\/2869"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media\/2866"}],"wp:attachment":[{"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/media?parent=2771"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/categories?post=2771"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geekosas.com\/index.php\/wp-json\/wp\/v2\/tags?post=2771"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}