{
  "python": "3.11.16",
  "os": "Darwin 25.6.0",
  "architecture": "arm64",
  "cpu": "Apple M5 Max",
  "logical_cpus": 18,
  "ram_gib": 48.0,
  "threads_requested": 4,
  "rows": 5000000,
  "parquet_bytes": 114386913,
  "uncompressed_parquet_page_bytes": 228863315,
  "pyarrow_version": "26.0.0",
  "execution_order": [
    "polars",
    "pandas",
    "dask",
    "duckdb"
  ],
  "measurements": [
    {
      "engine": "polars",
      "version": "2.0.0",
      "first_seconds": 0.017662208003457636,
      "repeat_seconds": 0.015462541981833056,
      "peak_rss_mib": 140.375,
      "result": [
        [
          "C27",
          6952347.9
        ],
        [
          "C08",
          6899831.350000001
        ],
        [
          "C22",
          6885085.93
        ],
        [
          "C03",
          6879975.68
        ],
        [
          "C02",
          6861261.3
        ],
        [
          "C21",
          6853752.640000001
        ],
        [
          "C24",
          6850547.76
        ],
        [
          "C01",
          6847024.71
        ],
        [
          "C26",
          6845673.640000001
        ],
        [
          "C13",
          6836699.29
        ]
      ]
    },
    {
      "engine": "pandas",
      "version": "3.0.6",
      "first_seconds": 0.06699004201800562,
      "repeat_seconds": 0.04151404098956846,
      "peak_rss_mib": 389.375,
      "result": [
        [
          "C27",
          6952347.9
        ],
        [
          "C08",
          6899831.35
        ],
        [
          "C22",
          6885085.93
        ],
        [
          "C03",
          6879975.68
        ],
        [
          "C02",
          6861261.3
        ],
        [
          "C21",
          6853752.64
        ],
        [
          "C24",
          6850547.76
        ],
        [
          "C01",
          6847024.71
        ],
        [
          "C26",
          6845673.64
        ],
        [
          "C13",
          6836699.29
        ]
      ]
    },
    {
      "engine": "dask",
      "version": "2026.8.0",
      "first_seconds": 0.03206379199400544,
      "repeat_seconds": 0.02364529197802767,
      "peak_rss_mib": 390.234375,
      "result": [
        [
          "C27",
          6952347.9
        ],
        [
          "C08",
          6899831.35
        ],
        [
          "C22",
          6885085.93
        ],
        [
          "C03",
          6879975.68
        ],
        [
          "C02",
          6861261.3
        ],
        [
          "C21",
          6853752.64
        ],
        [
          "C24",
          6850547.76
        ],
        [
          "C01",
          6847024.71
        ],
        [
          "C26",
          6845673.64
        ],
        [
          "C13",
          6836699.29
        ]
      ]
    },
    {
      "engine": "duckdb",
      "version": "1.4.5",
      "first_seconds": 0.17827337500057183,
      "repeat_seconds": 0.01829333300702274,
      "peak_rss_mib": 129.078125,
      "result": [
        [
          "C27",
          6952347.9
        ],
        [
          "C08",
          6899831.35
        ],
        [
          "C22",
          6885085.93
        ],
        [
          "C03",
          6879975.68
        ],
        [
          "C02",
          6861261.3
        ],
        [
          "C21",
          6853752.64
        ],
        [
          "C24",
          6850547.76
        ],
        [
          "C01",
          6847024.71
        ],
        [
          "C26",
          6845673.64
        ],
        [
          "C13",
          6836699.29
        ]
      ]
    }
  ],
  "duckdb_profile": "\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502\n\u2502\u2502    Query Profiling Information    \u2502\u2502\n\u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\nEXPLAIN ANALYZE      SELECT country, SUM(amount_cents) / 100.0 AS revenue     FROM read_parquet(?)     WHERE event_time >= TIMESTAMP '2026-09-01'       AND event_time <  TIMESTAMP '2026-10-01'       AND event_type = 'purchase'     GROUP BY country     ORDER BY revenue DESC, country     LIMIT 10 \n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\u2502\n\u2502\u2502              Total Time: 0.0195s             \u2502\u2502\n\u2502\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502           QUERY           \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502      EXPLAIN_ANALYZE      \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502           0 rows          \u2502\n\u2502          (0.00s)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502           TOP_N           \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502          Top: 10          \u2502\n\u2502                           \u2502\n\u2502         Order By:         \u2502\n\u2502     (sum(read_parquet     \u2502\n\u2502  .amount_cents) / 100.0)  \u2502\n\u2502            DESC           \u2502\n\u2502  read_parquet.country ASC \u2502\n\u2502                           \u2502\n\u2502          10 rows          \u2502\n\u2502          (0.00s)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502          country          \u2502\n\u2502          revenue          \u2502\n\u2502                           \u2502\n\u2502          30 rows          \u2502\n\u2502          (0.00s)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502       HASH_GROUP_BY       \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502         Groups: #0        \u2502\n\u2502    Aggregates: sum(#1)    \u2502\n\u2502                           \u2502\n\u2502          30 rows          \u2502\n\u2502          (0.00s)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         PROJECTION        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502          country          \u2502\n\u2502        amount_cents       \u2502\n\u2502                           \u2502\n\u2502        407,208 rows       \u2502\n\u2502          (0.00s)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502         TABLE_SCAN        \u2502\n\u2502    \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500   \u2502\n\u2502         Function:         \u2502\n\u2502        READ_PARQUET       \u2502\n\u2502                           \u2502\n\u2502        Projections:       \u2502\n\u2502          country          \u2502\n\u2502        amount_cents       \u2502\n\u2502                           \u2502\n\u2502          Filters:         \u2502\n\u2502 event_time>='2026-09-01 00\u2502\n\u2502   :00:00'::TIMESTAMP AND  \u2502\n\u2502  event_time<'2026-10-01 00\u2502\n\u2502     :00:00'::TIMESTAMP    \u2502\n\u2502   event_type='purchase'   \u2502\n\u2502                           \u2502\n\u2502    Total Files Read: 4    \u2502\n\u2502                           \u2502\n\u2502        407,208 rows       \u2502\n\u2502          (0.07s)          \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n",
  "method": "One fresh process per engine; two read/filter/group/sort/materialize runs after imports; no OS cache flush. RSS is lifetime peak including imports. Four files, null-free synthetic rows, low-cardinality aggregation. pandas/PyArrow and Dask receive column selections and scan filters; Polars uses lazy streaming; Dask uses Arrow filesystem and local threads. Not a spill test. Sorted results compared with relative tolerance 1e-12, absolute 1e-8 for final floating-point currency conversion."
}
