<https://c1.staticflickr.com/9/8245/8453257683_2f55e98120_b.jpg>
Wow, I've never saw this thing about multiple statements. Thanks! RTFM 

On Thursday, 25 May 2017 22:43:55 UTC+3, Mike Bayer wrote:
>
>
>
> On 05/25/2017 01:44 PM, Михаил Доронин wrote:
> >> SQLAlchemy batches inserts in the ORM as is possible and with Core you 
> >> do this explicitly, both make use of cursor.executemany() which is then 
> >> determined by how the DBAPI handles it. 
> > 
> > 
> > Ummm. If that is true, why this line is used when I pass a list of 
> > values (its from visit_insert)? Clearly sqlalchemy creates big string 
> > `VALUES (%s, %s), (%s, %s)....` by itself without executemany. 
> > 
> > 
> > 
> >          elif insert_stmt._has_multi_parameters: 
> >              text += " VALUES %s" % ( 
> >                  ", ".join( 
> >                      "(%s)" % ( 
> >                          ', '.join(c[1] for c in crud_param_set) 
> >                      ) 
> >                      for crud_param_set in crud_params 
> >                  ) 
> >              ) 
> > 
> > 
> > I've written benchmark again. 
> > 
> > https://gist.github.com/purpleP/35c4920020ad95585419eb1d250200b7 
> > 
> > TLDR; alchemy is more than three times slower than executemany for 
> > inserting 10000 values. 
>
> Hello - 
>
> I gave you links to detailed documentation that represents the many 
> years I have spent and developing documenting the performance 
> characteristics of SQLAlchemy. 
>
> The test you have posted here, along with your conclusions, does not 
> take this guidance into account nor does it indicate awareness of basic 
> API use as documented in the Core tutorial at: 
>
>
> http://docs.sqlalchemy.org/en/latest/core/tutorial.html#executing-multiple-statements
>  
>
> Here are the links again, which refer to the performance characteristics 
> in detail as well as illustrate how to make use of executemany(), along 
> with benchmarks comparing different API options: 
>
>
> http://docs.sqlalchemy.org/en/latest/faq/performance.html#i-m-inserting-400-000-rows-with-the-orm-and-it-s-really-slow
>  
>
>
> http://docs.sqlalchemy.org/en/latest/_modules/examples/performance/bulk_inserts.html.
>  
>
>
> SQLAlchemy's use of executemany() is a top-level, well documented 
> feature.  It is not an obscure, hidden side effect.   Years of effort 
> have gone into SQLAlchemy's documentation to ensure that behaviors like 
> these will not be mysterious. 
>
> Let's apply it to your script at: 
>
>
> https://gist.github.com/purpleP/35c4920020ad95585419eb1d250200b7#gistcomment-2106299
>  
>
> for 10K results: 
>
> ----------------------------------------------------------------------------------
>  
>
> benchmark: 3 tests 
> ----------------------------------------------------------------------------------
>  
>
> Name (time in ms)                       Min                 Max 
>        Mean             StdDev              Median                IQR 
>          Outliers(*)  Rounds  Iterations 
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  
>
> test_insert[raw]                   141.2799 (1.0)      326.9598 (1.0) 
>    182.5684 (1.0)      80.9658 (1.55)     144.1729 (1.0)      57.0499 
> (1.16)             1;1       5           1 
> test_insert[alcehmy_correct]       179.7159 (1.27)     340.2121 (1.04) 
>    224.5844 (1.23)     68.2835 (1.30)     188.8490 (1.31)     79.4864 
> (1.61)             1;0       5           1 
> test_insert[alchemy_incorrect]     495.6210 (3.51)     636.7581 (1.95) 
>    550.5236 (3.02)     52.3564 (1.0)      537.3681 (3.73)     49.3491 
> (1.0)              2;0       5           1 
> ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  
>
>
>
> for 100K rows (no OperationalError is raised): 
>
> ----------------------------------------------------------------------------- 
>
> benchmark: 3 tests 
> ----------------------------------------------------------------------------- 
>
> Name (time in s)                      Min               Max 
> Mean            StdDev            Median               IQR 
> Outliers(*)  Rounds  Iterations 
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  
>
> test_insert[raw]                   1.3214 (1.0)      1.4007 (1.0) 
> 1.3660 (1.0)      0.0307 (1.94)     1.3709 (1.0)      0.0448 (1.95) 
>         2;0       5           1 
> test_insert[alcehmy_correct]       1.7432 (1.32)     1.7848 (1.27) 
> 1.7645 (1.29)     0.0159 (1.0)      1.7655 (1.29)     0.0229 (1.0) 
>         2;0       5           1 
> test_insert[alchemy_incorrect]     5.7412 (4.34)     5.9293 (4.23) 
> 5.8330 (4.27)     0.0687 (4.33)     5.8319 (4.25)     0.0831 (3.63) 
>         2;0       5           1 
> ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>  
>
>
> SQLAlchemy Core is therefore about 1.2 times slower than pure C 
> mysqlclient when used as documented.  Which is actually a little less 
> than the difference against SQLite's driver vs. Core, that is described 
> at 
>
> http://docs.sqlalchemy.org/en/latest/faq/performance.html#i-m-inserting-400-000-rows-with-the-orm-and-it-s-really-slow,
>  
>
> where Core is more like 1.6 times slower. 
>
> The SQLAlchemy project is very welcoming of thoughtful criticism and is 
> in fact the product of over a decade of critique by a wide range of 
> users.  I encourage you to contribute, but please ensure you take the 
> time for links that I provide in response to your questions.   I am not 
> the brightest light on the planet but I have been doing this for a very 
> long time.  Thanks! 
>
>
>
>
>
>
>
>
> > 
> > for a million values sqlalchemy drops with OperationalError. 
> > 
> > 
> > Here's a vmprof visualization for 10000 values 
> > http://vmprof.com/#/c7f9a4fd-55f9-469d-b6e4-b7cac04473fa  . 
> > 
> > vmprof is much better than cProfile give it a try if you still coding in 
> python. 
> > 
> > 
> > If you will need more data then just a visualization - I'll try to 
> provide it. But you have the benchmark code in the gist. 
> > 
> > -- 
> > SQLAlchemy - 
> > The Python SQL Toolkit and Object Relational Mapper 
> > 
> > http://www.sqlalchemy.org/ 
> > 
> > To post example code, please provide an MCVE: Minimal, Complete, and 
> > Verifiable Example. See http://stackoverflow.com/help/mcve for a full 
> > description. 
> > --- 
> > You received this message because you are subscribed to the Google 
> > Groups "sqlalchemy" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> > an email to sqlalchemy+...@googlegroups.com <javascript:> 
> > <mailto:sqlalchemy+unsubscr...@googlegroups.com <javascript:>>. 
> > To post to this group, send email to sqlal...@googlegroups.com 
> <javascript:> 
> > <mailto:sqlal...@googlegroups.com <javascript:>>. 
> > Visit this group at https://groups.google.com/group/sqlalchemy. 
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
SQLAlchemy - 
The Python SQL Toolkit and Object Relational Mapper

http://www.sqlalchemy.org/

To post example code, please provide an MCVE: Minimal, Complete, and Verifiable 
Example.  See  http://stackoverflow.com/help/mcve for a full description.
--- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sqlalchemy+unsubscr...@googlegroups.com.
To post to this group, send email to sqlalchemy@googlegroups.com.
Visit this group at https://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/d/optout.

Reply via email to