I'm planning on using the Teradata Python module, which can use either the Teradata REST API or ODBC to connect to Teradata. I'm wondering what the performance would be like for REST vs. ODBC connection methods for fairly large data pulls (> 1 million rows, > 1 GB of results).
Information on Teradata's site suggests that the use case for the REST API is more for direct access of Teradata by browsers or web applications, which implies to me that it may not be optimized for queries that return more data than a browser would be expected to handle. I also wonder if JSON overhead will make it less efficient than the ODBC data format for sending query results over the network.
Does anyone have experience with Teradata REST services performance or can point to any comparisons between REST and ODBC for Teradata?
I had exactly the same question. As the rest web server is active for us, I just run a few tests. I tested PyTD with rest and odbc back ends, and jdbc using jaydebeapi + Jpype1. I used Python 3.5, CentOS 7 machine, I got similar results with python 3.6 on centos and on windows. 
Rest was the fastest and jdbc was the slowest. It is interesting, because in R JDBC was really fast. That probably means JPype is the bottleneck. Rest was also very fast for writing, but my guess is that could be improved in JDBC using prepared statements appropriately.
We are now going to switch to rest for production. Let's see how it goes, it is also not problem free for sure. Another advantage is that our analysts want also to work on their own pcs/macs and rest is the easiest to install particularly on windows (you do pip install teradata and you are done, while for odbc and jaydebeapi+Jpype you need a compiler, and with odbc spend some time to get it configured right).
If speed is critical I guess another way would be to write a java command line app that fetches the rows, writes them to a csv and then read the csv from python. I did not test, but based on my previous experience on these kind of issues I bet that is going to be faster than anything else.

Selecting 1M rows

Python 3- JDBC:    24 min
Python 3- ODBC:    6.5 min
Python 3- Rest:    4 min
R - JDBC:            35 s

Selecting 100 K rows

Python 3- JDBC      141 s
Python 3- ODBC      41 s
Python 3- Rest      16 s
R - JDBC            5 s

Inserting 100 K Rows

Python 3- JDBC      got errors, too lazy to correct them
Python 3- ODBC      7 min
Python 3- Rest      8 s (batch) 9 min (no batch)
R - JDBC            8 min
How does the Teradata REST API performance compare to other means of querying Teradata?